python-OpenCV中的Canny可以同时处理灰度和彩色图像吗?
作者:互联网
我对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的步骤来看,当我们计算梯度时,我认为它应该是单通道,然后可以计算出来.如果图像是彩色的(三个通道),我们如何计算渐变?我们是否分别计算三个通道?它是如何工作的?
解决方法:
是的,OpenCV的Canny实现可以处理多个通道.
请记住,OpenCV是开源的,因此您只需检查实现即可找到此类信息.
基本上,根据Sobel导数(dx和dy),Canny在非最大值抑制之前所做的就是为每个像素计算梯度的大小(范数).
如果您有多个通道(如in the source code所示),则在所有ch通道中,给定像素的渐变幅度最高.
标签:edge-detection,opencv,computer-vision,python,canny-operator 来源: https://codeday.me/bug/20191112/2024115.html