我对 OpenCV 中的 Canny边缘检测器有一些疑问。
这是我试过的代码。
def auto_canny(image, sigma=0.33):
v = np.median(image)
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(image, lower, upper)
然后,
##### first situation #####
img = cv2.imread('mango.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
auto = auto_canny(gray)
cv2.imwrite('mango_gray_edge.jpg', auto)
在这种情况下,我得到了这样的图像:
##### second situation #####
img = cv2.imread('mango.jpg')
auto = auto_canny(img)
cv2.imwrite('mango_color_edge.jpg', auto)
在这种情况下,我得到了这样的图像:
这是原始图片:
第一种情况和第二种情况的不同之处在于我是否将彩色图像转换为灰度。 但是,我对此感到困惑。因为,
在第一种情况下,我将图像转换为灰度,因此图像具有单个通道。在第二种情况下,图像仍然有三个通道。
当我没有将它转换为灰度时,边缘要好得多,就像第二种情况一样。
所以我的问题是,
OpenCV中的Canny功能是否包含将图像转换为灰度的方法?我的意思是,在使用cv2.Canny()
之前,是否需要将图像转换为灰度?
Canny如何同时处理单通道(第一种情况转换为灰度)和三种通道(第二种情况下的原始图像)图像?
Canny如何实际工作? Canny可以直接处理彩色图像还是必须先将彩色图像转换为灰度图像?
从Canny的步骤开始,当我们计算梯度时,我认为它应该是单通道,然后可以计算出来。如果图像是彩色(三个通道),我们如何计算梯度?我们分别计算三个频道吗?它是如何工作的?
答案 0 :(得分:3)
是的,OpenCV的Canny实现可以处理多个通道。
请记住,OpenCV是开源的,因此您只需检查实现即可找到此类信息。
根据索贝尔导数(norm
和dx
),基本上,Canny在非最大值抑制之前所做的是计算每个像素的渐变幅度(dy
)。
如果您有多个频道,可以看到in the source code,则给定像素的渐变幅度在所有ch
频道中最高。