Canny Edge Detector问题 - 返回黑色图像

时间:2015-09-11 17:36:07

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

我正在尝试在此图像上运行canny边缘检测器:

enter image description here

使用此代码:

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的西格玛。

enter image description here

5 个答案:

答案 0 :(得分:2)

您的图片需要在相关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')

答案 1 :(得分:1)

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

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

deb-src:

答案 2 :(得分:0)

当图像以浮动格式加载时(即0-1范围内),就会发生问题。加载程序对某些类型的图像执行此操作。您可以通过以下方法检查加载的图像的类型:

  

print(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)

希望这会有所帮助,

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

保存图像时发生问题。您可以使用其他库(例如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")