为什么 skimage 中的 'imshow' 无法正常使用位移位
Why 'imshow' in skimage does not work properly with bit shift
我尝试用位移法显示位平面图像。
但是我总是得到所有子图的全黑图像。
import skimage.io as io
import skimage.util as util
import numpy as np
from matplotlib import pyplot as plt
from skimage.color import rgb2gray
import skimage.filters as fl
path = 'D:/Users/user/PycharmProjects/Image_Processing/Data/16.png'
w = io.imread(path)
# convert the colorful image to a grey scale image
gray = rgb2gray(w)
plt.imshow(gray, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)
plt.show()
# bit shift for creating bit plane images
bps = [(np.uint8(gray) >> i) % 2 for i in range(8)]
# plot 8 subplots to show the result
for i in range(8):
plt.subplot(3, 3, i+1)
# add color map to assure the present color is in grey scale
io.imshow(bps[i], , cmap=plt.get_cmap('gray'))
plt.axis('off')
plt.show()
Original grey scale picture
Result
执行结果也会有警告:
D:\Users\user\Anaconda3\python.exe D:/Users/user/PycharmProjects/Image_Processing/read_image.py
D:\Users\user\Anaconda3\lib\site-packages\skimage\io_plugins\matplotlib_plugin.py:75: UserWarning: Low image data range; displaying image with stretched contrast.
warn("Low image data range; displaying image with "
Process finished with exit code 0
顺便说一下,如果我使用 otsu,yen,li 的过滤器和阈值。
我会得到预期的结果。
thresh = fl.threshold_otsu(gray)
binary = gray >= thresh
io.imshow(binary)
plt.show()
你能告诉我原来的方法哪里错了吗?
在其他一些线程中提到了将图片从一个类别转换为另一个类别的损失。
而且我用纯opencv的方法也能成功。
我已经检查了以下相关线程,但我仍然不知道如何解决这个问题:
感谢您的帮助!
我发现我误用了 numpy 无符号整数转换,因为原始灰色数组包含 0 到 1 之间的无符号浮点数。
首先,我需要将灰色的强度变成大于1的浮点数。
bps = [(np.uint8(gray*255) >> i) % 2 for i in range(8)]
那么,问题就解决了
我尝试用位移法显示位平面图像。 但是我总是得到所有子图的全黑图像。
import skimage.io as io
import skimage.util as util
import numpy as np
from matplotlib import pyplot as plt
from skimage.color import rgb2gray
import skimage.filters as fl
path = 'D:/Users/user/PycharmProjects/Image_Processing/Data/16.png'
w = io.imread(path)
# convert the colorful image to a grey scale image
gray = rgb2gray(w)
plt.imshow(gray, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)
plt.show()
# bit shift for creating bit plane images
bps = [(np.uint8(gray) >> i) % 2 for i in range(8)]
# plot 8 subplots to show the result
for i in range(8):
plt.subplot(3, 3, i+1)
# add color map to assure the present color is in grey scale
io.imshow(bps[i], , cmap=plt.get_cmap('gray'))
plt.axis('off')
plt.show()
Original grey scale picture
Result
执行结果也会有警告:
D:\Users\user\Anaconda3\python.exe D:/Users/user/PycharmProjects/Image_Processing/read_image.py D:\Users\user\Anaconda3\lib\site-packages\skimage\io_plugins\matplotlib_plugin.py:75: UserWarning: Low image data range; displaying image with stretched contrast. warn("Low image data range; displaying image with "
Process finished with exit code 0
顺便说一下,如果我使用 otsu,yen,li 的过滤器和阈值。 我会得到预期的结果。
thresh = fl.threshold_otsu(gray)
binary = gray >= thresh
io.imshow(binary)
plt.show()
你能告诉我原来的方法哪里错了吗? 在其他一些线程中提到了将图片从一个类别转换为另一个类别的损失。 而且我用纯opencv的方法也能成功。
我已经检查了以下相关线程,但我仍然不知道如何解决这个问题:
感谢您的帮助!
我发现我误用了 numpy 无符号整数转换,因为原始灰色数组包含 0 到 1 之间的无符号浮点数。 首先,我需要将灰色的强度变成大于1的浮点数。
bps = [(np.uint8(gray*255) >> i) % 2 for i in range(8)]
那么,问题就解决了