我正在尝试在此图像上运行canny边缘检测器:
使用此代码:
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的西格玛。
答案 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")