Canny 边缘检测器出现问题 - 返回黑色图像
Trouble with Canny Edge Detector - Returning black image
我正在尝试 运行 此图像上的 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 的西格玛。
您的图像需要在相关数据类型的正确范围内,如用户手册中所述: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')
所以问题出在 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')
当图像加载为浮动(即在 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)
希望这对您有所帮助,
我有同样的情况,这对我有帮助。在使用 Canny 过滤器之前,只需将图像数组的元素转换为 float32 类型:
array = np.array(img)
array = array.astype('float32')
out = feature.canny(array, sigma=1, )
图片保存时出现问题。您可以使用其他库(如 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")
我正在尝试 运行 此图像上的 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 的西格玛。
您的图像需要在相关数据类型的正确范围内,如用户手册中所述: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')
所以问题出在 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')
当图像加载为浮动(即在 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)
希望这对您有所帮助,
我有同样的情况,这对我有帮助。在使用 Canny 过滤器之前,只需将图像数组的元素转换为 float32 类型:
array = np.array(img)
array = array.astype('float32')
out = feature.canny(array, sigma=1, )
图片保存时出现问题。您可以使用其他库(如 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")