我有一些关于Canny 边缘检测器 in OpenCV.
这是我尝试过的代码。
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)
then,
##### 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)
In this situation, I got an image like this:
![enter image description here](https://i.stack.imgur.com/xlloJ.png)
##### second situation #####
img = cv2.imread('mango.jpg')
auto = auto_canny(img)
cv2.imwrite('mango_color_edge.jpg', auto)
in this situation, I got an image like this:
![enter image description here](https://i.stack.imgur.com/ZF5nz.png)
and this is the original image:
![](https://i.stack.imgur.com/45TAU.jpg)
第一种情况和第二种情况的区别在于我是否将彩色图像转换为灰度图像。But,我对此很困惑。因为,
在第一种情况下,我将图像转换为灰度,因此图像具有单通道。而在第二种情况下,图像仍然具有三个通道。
当我没有将其转换为灰度时,边缘要好得多,就像第二种情况一样。
所以我的问题是,
OpenCV中的Canny函数是否包含将图像转换为灰度的方法?我的意思是,在使用之前我需要将图像转换为灰度吗cv2.Canny()
?
Canny如何同时处理单通道(第一种情况转换为灰度)和三通道(原始图像如第二种情况)图像?
Canny实际上是如何工作的? Canny可以直接处理彩色图像还是必须先将彩色图像转换为灰度图像?
从Canny的步骤来看,我们计算梯度的时候,我认为应该是单通道的,那么就可以计算了。如果图像是彩色的(三个通道),我们如何计算梯度?我们分别计算三个通道吗?它是如何工作的?