skimage treshold_local不适用于使用io.imread加载的图片

时间:2019-07-16 20:21:17

标签: scikit-image

我正在尝试从Scikit Image网站获得的示例Python脚本之一。该脚本演示了本地Otsu细分。该脚本适用于使用

加载的图片
  

data.page()

但不使用

  

io.imread

。有什么建议吗?

https://scikit-image.org/docs/dev/auto_examples/applications/plot_thresholding.html#sphx-glr-auto-examples-applications-plot-thresholding-py

图片文件

enter image description here

实际输出-本地阈值窗口为空

enter image description here

如您所见,全局阈值有效,但是本地阈值未能产生任何结果。

奇怪的是,如果我使用data.page(),那么一切正常。

脚本

from skimage import io
from skimage.color import rgb2gray
import matplotlib.pyplot as plt
from skimage.filters import threshold_otsu,threshold_local
import matplotlib
from skimage import data
from skimage.util import img_as_ubyte

filename="C:\\Lenna.png"
mypic= img_as_ubyte (io.imread(filename))


#image = data.page()  #This works - why not io.imread ?
imagefromfile=io.imread(filename)
image = rgb2gray(imagefromfile)

global_thresh = threshold_otsu(image)
binary_global = image > global_thresh

block_size = 35
local_thresh = threshold_local(image, block_size, offset=10)
binary_local = image > local_thresh

fig, axes = plt.subplots(nrows=3, figsize=(7, 8))
ax = axes.ravel()
plt.gray()

ax[0].imshow(image)
ax[0].set_title('Original')

ax[1].imshow(binary_global)
ax[1].set_title('Global thresholding')

ax[2].imshow(binary_local)
ax[2].set_title('Local thresholding')

for a in ax:
    a.axis('off')

plt.show()

1 个答案:

答案 0 :(得分:0)

如果加载lenna.png并打印其形状,则会看到它是4通道RGBA图像,而不是3通道RGB图像。

print mypic.shape
(512, 512, 4)

我不确定您的代码的哪个部分适用于哪个图像,所以我不确定下一步要去哪里,但是我想您只想获取RGB部分并丢弃alpha:

RGB = mypic[...,:3]