13

我对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)

在这种情况下,我得到了这样的图像: 在此处输入图像描述

这是原始图像:

第一种情况和第二种情况的区别在于我是否将彩色图像转换为灰度。但是,我对此感到困惑。因为,

在第一种情况下,我将图像转换为灰度,因此图像只有一个通道。而在第二种情况下,图像仍然具有三个通道。

当我没有将其转换为灰度时,边缘会好得多,就像在第二种情况下一样。

所以我的问题是,

  1. OpenCV 中的 Canny 函数是否包含将图像转换为灰度的方法?我的意思是,我需要在使用之前将图像转换为灰度cv2.Canny()吗?

  2. Canny 如何同时处理单通道(第一种情况转换为灰度)和三通道(原始图像如第二种情况)图像?

  3. Canny 实际是如何工作的?Canny可以直接处理彩色图像还是必须先将彩色图像转换为灰度?

  4. 从Canny的步骤来看,我们计算梯度的时候,我觉得应该是单通道的,然后就可以计算了。如果图像是彩色的(三个通道),我们如何计算梯度?我们分别计算三个通道吗?它是如何工作的?

4

1 回答 1

10

是的,OpenCV 的 Canny 实现可以处理多个通道。


请记住,OpenCV 是开源的,因此您只需检查实现即可找到此类信息。

基本上,Canny 在非极大值抑制之前所做的是norm根据 Sobel 导数 (dx和) 计算每个像素的梯度大小 ( dy)。如果您有多个通道,如您在源代码ch中所见,给定像素的梯度幅度是所有通道中最高的。

于 2016-11-21T19:28:32.370 回答