【问题标题】:Why 'imshow' in skimage does not work properly with bit shift为什么 skimage 中的“imshow”不能与位移一起正常工作
【发布时间】:2019-11-24 06:04:00
【问题描述】:

我尝试使用位移方法显示位平面图像。 但是,我总是得到所有子图的全黑图像。

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;显示具有拉伸对比度的图像。 warn("图像数据范围低;显示图像时"

进程以退出代码 0 结束

顺便说一句,如果我使用来自 otsu,yen,li 的过滤器和阈值。 我会得到预期的结果。

thresh = fl.threshold_otsu(gray)
binary = gray >= thresh
io.imshow(binary)
plt.show()

你能告诉我我原来的方法哪里出错了吗? 在其他一些线程中提到了将图片从一个类别转换为另一个类别的损失。 此外,我也可以使用纯opencv方法获得成功的结果。

我已经检查了以下相关线程,但我仍然不知道如何解决这个问题:

skimage issue

bit plane slicing

threshold method

感谢您的帮助!

【问题讨论】:

    标签: python scikit-image


    【解决方案1】:

    我发现我误用了 numpy 无符号整数转换,因为原始灰色数组包含 0 到 1 之间的无符号浮点数。 首先,我需要将灰色的强度转换为大于 1 的浮点数。

    bps = [(np.uint8(gray*255) >> i) % 2 for i in range(8)] 
    

    那么,问题就解决了。

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 2021-12-06
      • 2020-09-01
      • 1970-01-01
      • 2021-12-15
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多