【问题标题】:Can Canny in OpenCV deal with both grayscale and color images?OpenCV 中的 Canny 可以同时处理灰度和彩色图像吗?
【发布时间】:2017-04-05 04:20:08
【问题描述】:

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

【问题讨论】:

    标签: python opencv computer-vision edge-detection canny-operator


    【解决方案1】:

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


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

    基本上,Canny 在非极大值抑制之前所做的是根据 Sobel 导数(dxdy)计算每个像素的梯度幅度(norm)。 如果您有多个通道,如您所见in the source code,则给定像素的梯度幅度是所有ch 通道中最高的。

    【讨论】:

    • 它可以处理彩色图像吗?他们什么时候犯的?我的书说 Canny 只处理灰度。
    • 那么,3 通道图像优于 1 通道图像来执行 Canny 边缘检测?我只是好奇。
    • @Sherzod 通常您会使用 1ch 图像。 OpenCV 可能也处理 3ch 的情况,只是为了易于使用,不一定是为了更好的结果。
    • @Miki - 但结果不同,3 通道图像的结果看起来更好。或者,情况不同?如果是这样,我们是否必须检查这两种方法并每次都选择更好的一种?谢谢你的回答:)
    • @Miki LTTP,但如果您不介意,我也想回答 Sherzod 的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2021-08-19
    • 2019-03-04
    • 2015-10-07
    • 2022-01-12
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多