【问题标题】:Trouble with Canny Edge Detector - Returning black imageCanny Edge Detector 出现问题 - 返回黑色图像
【发布时间】:2015-12-08 08:24:28
【问题描述】:

我正在尝试在这张图片上运行精明的边缘检测器:

使用此代码:

def edges(img):
    from skimage import feature
    img = Image.open(img)
    img.convert('L')
    array = np.array(img)    
    out = feature.canny(array, sigma=1, )
    return Image.fromarray(out,'L')

edges('Q_3.jpg').save('Q_3_edges.jpg')

但我只是得到一个黑色图像。有什么想法我可能做错了吗?我尝试了 1 和 3 的 sigma。

【问题讨论】:

    标签: python computer-vision scikit-image canny-operator


    【解决方案1】:

    您的图像需要在相关 dtype 的正确范围内,如用户手册中所述:http://scikit-image.org/docs/stable/user_guide/data_types.html

    如果您使用 scikit-image 图像 I/O 函数,这应该会自动处理:

    from skimage import io
    img = io.imread('Q_3.jpg')
    

    【讨论】:

      【解决方案2】:

      我有同样的情况,这对我有帮助。在使用 Canny 过滤器之前,只需将图像数组的元素转换为 float32 类型:

      array = np.array(img)
      array = array.astype('float32')    
      out = feature.canny(array, sigma=1, )
      

      【讨论】:

        【解决方案3】:

        所以问题在于 canny 函数返回和布尔类型的数组。

        奇怪的是,将 Image.fromarray 模式设置为 '1' 并没有帮助。相反,这是我让它工作的唯一方法。将输出数组转换为灰度:

        def edges(img):
            from skimage import feature
            img = Image.open(img)
            img.convert('L')
            array = np.array(img)
            out = np.uint8(feature.canny(array, sigma=1, ) * 255)
            return Image.fromarray(out,mode='L')
        

        【讨论】:

        • 这是预期的行为,如上所述。
        【解决方案4】:

        当图像加载为浮点数(即在 0-1 范围内)时会出现问题。加载器对某些类型的图像执行此操作。您可以通过以下方式检查加载图像的类型:

        打印(img.dtype)

        如果输出类似于 float64(即不是 uint8),那么您的图像在 0-1 范围内。

        Canny 需要 0-255 范围内的图像。因此,解决方案很简单:

        from skimage import img_as_ubyte
        img = io.imread("an_image.jpg")
        img = img_as_ubyte(img)
        

        希望这会有所帮助,

        【讨论】:

          【解决方案5】:

          保存图像时会出现问题。您可以使用 matplotlib 等其他库保存图像:

          import numpy as np
          import matplotlib.pyplot as plt
          from skimage import feature
          from skimage import io 
          
          def edges(img):
              img = io.imread(img)
              array = np.array(img)    
              out = feature.canny(array, sigma=1, )
              return out
          
          plt.imsave("canny.jpg", edges("input.jpg"), cmap="Greys")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-04-27
            • 1970-01-01
            • 1970-01-01
            • 2011-08-08
            • 1970-01-01
            • 1970-01-01
            • 2015-09-12
            相关资源
            最近更新 更多