为什么 Sobel 过滤 return 黑色方块?
Why does the Sobel filter return a black square?
我正在尝试使用 skimage
中的 sobel
和 prewitt
过滤器进行边缘检测以比较结果,但对于两者我都只得到黑色方块!
这是我的代码:
import numpy as np
from skimage import filters
from PIL import Image
a=Image.open('F:/CT1.png').convert('L')
a.show()
a=np.asarray(a)
b=filters.sobel(a)
b=Image.fromarray(b)
b.show()
与scikit-image
中的大多数方法一样,sobel
function uses np.float64
for calculations, and thus converts your image appropriately to the range 0.0 ... 1.0
. Following, your result b
is also of type np.float64
with values in the same range. When now converting to some Pillow Image
object, its mode设置为F
,用于32位浮点像素 .
现在,documentation on Image.show
告诉我们,例如:
On Windows, the image is opened with the standard PNG display utility.
目前还不清楚图像实际以哪种文件格式(?)显示。看起来,它是 PNG,至少根据临时文件名。但是,例如,将模式 F
的某些 Image
对象保存为 PNG 或 JPG 是行不通的!因此,看来必须以某种方式转换图像才能使其可显示。第一个猜测是,一些常规的 8 位图像被选为默认值,因为您得到几乎全黑的图像,表明值 0
和可能 1
被视为“非常暗”。而且,事实上,当使用像
这样的东西时
b=Image.fromarray(b * 255)
Windows 图像预览在使用 b.show()
时显示正确的图像。
因此,这将是 显示 的解决方法。
尽管如此,如果您想 保存 图像,则不一定需要转换,而只需要使用适当的文件格式来存储这些 32 位信息,例如 TIFF:
b=Image.fromarray(b)
b.save('b.tiff')
我正在尝试使用 skimage
中的 sobel
和 prewitt
过滤器进行边缘检测以比较结果,但对于两者我都只得到黑色方块!
这是我的代码:
import numpy as np
from skimage import filters
from PIL import Image
a=Image.open('F:/CT1.png').convert('L')
a.show()
a=np.asarray(a)
b=filters.sobel(a)
b=Image.fromarray(b)
b.show()
与scikit-image
中的大多数方法一样,sobel
function uses np.float64
for calculations, and thus converts your image appropriately to the range 0.0 ... 1.0
. Following, your result b
is also of type np.float64
with values in the same range. When now converting to some Pillow Image
object, its mode设置为F
,用于32位浮点像素 .
现在,documentation on Image.show
告诉我们,例如:
On Windows, the image is opened with the standard PNG display utility.
目前还不清楚图像实际以哪种文件格式(?)显示。看起来,它是 PNG,至少根据临时文件名。但是,例如,将模式 F
的某些 Image
对象保存为 PNG 或 JPG 是行不通的!因此,看来必须以某种方式转换图像才能使其可显示。第一个猜测是,一些常规的 8 位图像被选为默认值,因为您得到几乎全黑的图像,表明值 0
和可能 1
被视为“非常暗”。而且,事实上,当使用像
b=Image.fromarray(b * 255)
Windows 图像预览在使用 b.show()
时显示正确的图像。
因此,这将是 显示 的解决方法。
尽管如此,如果您想 保存 图像,则不一定需要转换,而只需要使用适当的文件格式来存储这些 32 位信息,例如 TIFF:
b=Image.fromarray(b)
b.save('b.tiff')