在彩色图像上使用Canny

问题描述

我是图像处理和Opencv的新手,但是最近我正在研究边缘检测的想法,对此有疑问:

  • 可以将canny直接应用于彩色图像而不将其转换为灰度吗?这会影响结果吗?我尝试了一下(使用c ++ opnencv函数),没有错误或问题,结果与将图像更改为灰度后的结果不同。

  • 我读到彩色图像,我应该分别在每个通道上应用canny,然后合并结果。.好的,假设每个通道有3个结果,如何将它们组合在一起以获得最终结果?

  • 在灰度下处理彩色图像的速度是否真的比在彩色图像上处理的速度快,因为在后面我们有3个通道(从逻辑上看是可以的,但是每种方法的优缺点之间没有比较的参考;我所拥有的只是灰度更快,而对于图像分割,彩色图像可以提供更多信息)在边缘检测的概念中,是否使用彩色图像更好?

解决方法

如果您接受python,则可以这样做:

第二个问题:


    1. 使用split方法分离通道以分离通道,对每个通道Canny应用不同的阈值水平,然后使用merge方法来合并结果。

  • import cv2   
    
    img = cv2.imread("grl.jpg")
    (B,G,R) = cv2.split(img)
    B_cny = cv2.Canny(B,50,200)
    G_cny = cv2.Canny(G,200)
    R_cny = cv2.Canny(R,200)
    img_cny = cv2.merge([B_cny,G_cny,R_cny]) 
    
  • 结果:


  • enter image description here enter image description here

  • 可能的问题:为什么split返回BGR

  • 答案:Opencv以(BGR)格式读取图像,因此split返回(B,R)格式

  • 您还可以直接将其应用于图像(感谢@ fmw42):

  • 结果:

  • enter image description here

第三个问题:


  • 是的,处理灰度图像比彩色图像要快得多。

  • 我们看到的图像具有不同的颜色,但是计算机看到的是值的矩阵:

    • 例如:

      • 25 45 67 37 90 ..
        56  .
        46     .     
        34        .
        13           .
        .
        .
        
      • 矩阵中的每个单元格可以在0-255之间的范围内变化。灰度图像(矩阵)只有1个通道,彩色图像有3个通道(矩阵)

      • 因此,您可以认为计算单个矩阵(灰色)比计算3个矩阵(图像)要快