Jump_over 2022-03-12 10:30 采纳率: 100%
浏览 114
已结题

Sobel算子使用中为什么可以直接处理灰度图像?

问题遇到的现象和发生背景

在讲解Sobel算子的原理时讲到找出边界的时候最终获得边界的二值图像,用灰度处理后不就造成有多数地方不是0么?

问题相关代码,请勿粘贴截图

import cv2
import numpy as np

erzhi=cv2.imread("abba.png")
Gerzhi = cv2.cvtColor(erzhi, cv2.COLOR_BGR2GRAY) #此处的“cv2.COLOR_BGR2GRAY”不是表示以灰度图像读取么?
ax=cv2.Sobel(Gerzhi,cv2.CV_64F,1,0)
ay=cv2.Sobel(Gerzhi,cv2.CV_64F,0,1)
ax=cv2.convertScaleAbs(ax)
ay=cv2.convertScaleAbs(ay)
erzhi1=cv2.addWeighted(ax,0.5,ay,0.5,0)
cv2.imshow("EZ",erzhi)
cv2.imshow("EZax",ax)
cv2.imshow("EZay",ay)
cv2.imshow("EZ1",erzhi1)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果及报错内容

原图和边界图

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 小一201912 2022-03-12 11:09
    关注

    不是特别理解你说的,说下我的理解
    首先Sobel算子是用于边缘检测的算子,得出的结果并不是二值图,得到二值图像往往是设置了一个阈值,可以理解为当sobel算子结果超过该阈值时,给点为边缘点(为1),否则为非边缘点(为0),但是这部分计算并不属于sobel本身,需要你单独写出这部分程序的。
    很多地方是0并不是因为是灰度图像,而是该区域内像素值都相等,sobel才会给你算出是零,但当该区域是渐变区域的时候,也是会算出值的,只不过不如边缘区域的值大(一般都是很小的值)因此有些为了防治这些渐变导致边界不明确,有人就选择用二值图像表示边界,但是阈值选择不好,噪声也会成边界点。另外sobel也是有方向的,不同的方向效果也不一样,你可以添加二值化处理达到你想要的结果。
    给你推荐几个帖子参考https://blog.csdn.net/qq_27261889/article/details/80891491
    https://blog.csdn.net/weixin_42216109/article/details/89642914
    https://blog.csdn.net/bugang4663/article/details/109589177?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月13日
  • 创建了问题 3月12日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部