我对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的步骤来看,我们计算梯度的时候,我觉得应该是单通道的,然后就可以计算了。如果图像是彩色的(三个通道),我们如何计算梯度?我们分别计算三个通道吗?它是如何工作的?