如何修复我自己的图像上的错误 运行 局部 Otsu 阈值示例?

How to fix error running local Otsu threshold example on my own images?

我基本上是在尝试预处理图像以获得更好的 OCR 识别。我决定使用 scikit-image(或者我应该使用其他东西)?

我正在按照此处显示的示例进行操作:

https://scikit-image.org/docs/stable/auto_examples/applications/plot_thresholding.html#id4

而且,我已经下载了这个脚本:

https://scikit-image.org/docs/stable/_downloads/939bd4a228ba1525a5e2896c819e2218/plot_thresholding.py

为了用我自己的图像进行测试,我已经替换了这一行

img = img_as_ubyte(data.page())

有了这个:

from skimage import io

img = img_as_ubyte(io.imread('test.jpg'))

但是,我收到了这个错误:

File "/Users/janine/Downloads/test.py", line 207, in <module>
  local_otsu = rank.otsu(img, selem)
File "/usr/local/lib/python3.9/site-packages/skimage/filters/rank/generic.py", line 1399, in otsu
  return _apply_scalar_per_pixel_3D(generic_cy._otsu_3D, image,
File "/usr/local/lib/python3.9/site-packages/skimage/filters/rank/generic.py", line 278, in _apply_scalar_per_pixel_3D
  image, selem, out, mask, n_bins = _handle_input_3D(image, selem, out, mask,
File "/usr/local/lib/python3.9/site-packages/skimage/filters/rank/generic.py", line 199, in _handle_input_3D
  raise ValueError('Image dimensions and neighborhood dimensions'
    ValueError: Image dimensions and neighborhood dimensionsdo not match

我试过多张图片,所以问题不在于图片。

检查 data.page(),我们注意到该图像是单通道(即灰度)图像。稍后在链接的示例中,您可以像这样设置结构元素 selem

selem = disk(radius)

请注意,skimage.morphology.disk 是“2D 结构元素”,只能用于“2D 图像”,即灰度图像。

很可能,您的 test.jpg 现在是三通道(即彩色)图像,因此是“3D 图像”。当使用像 disk 这样的“2D 结构元素”和“3D 图像”时,您会得到给定的错误。

现在,您有两个选择:

  1. 只需在 skimage.io.imread 中设置 as_gray=True,即可将输入的彩色图像转换为灰度图像。然后您可以按原样使用其余代码。
  2. 使用一些“3D 结构化元素”,如 skimage.morphology.ball,这将是 disk 的 3D 等价物,以按原样使用您的输入图像。

这里有一些最小的代码供参考:

from matplotlib import pyplot as plt
from skimage.filters import rank
from skimage.io import imread
from skimage.morphology import ball, disk
from skimage.util import img_as_ubyte

# Option #1: 2D image (e.g. grayscale input image), and 2D structuring element
img = img_as_ubyte(imread('path/to/your/image.png', as_gray=True))
radius = 15
selem = disk(radius)
local_otsu = rank.otsu(img, selem)
plt.figure(1)
plt.imshow(local_otsu, vmin=0, vmax=255, cmap='gray')

# Option #2: 3D image (original input image), and 3D structuring element
img = img_as_ubyte(imread('path/to/your/image.png'))
radius = 15
selem = ball(radius)
local_otsu = rank.otsu(img, selem)
plt.figure(2)
plt.imshow(local_otsu, vmin=0, vmax=255)

plt.show()

并且,两个结果输出:

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.19041-SP0
Python:        3.9.1
PyCharm:       2021.1.1
Matplotlib:    3.4.1
scikit-image:  0.18.1
----------------------------------------