如何修复我自己的图像上的错误 运行 局部 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
而且,我已经下载了这个脚本:
为了用我自己的图像进行测试,我已经替换了这一行
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 图像”时,您会得到给定的错误。
现在,您有两个选择:
- 只需在
skimage.io.imread
中设置 as_gray=True
,即可将输入的彩色图像转换为灰度图像。然后您可以按原样使用其余代码。
- 使用一些“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
----------------------------------------
我基本上是在尝试预处理图像以获得更好的 OCR 识别。我决定使用 scikit-image
(或者我应该使用其他东西)?
我正在按照此处显示的示例进行操作:
https://scikit-image.org/docs/stable/auto_examples/applications/plot_thresholding.html#id4
而且,我已经下载了这个脚本:
为了用我自己的图像进行测试,我已经替换了这一行
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 图像”时,您会得到给定的错误。
现在,您有两个选择:
- 只需在
skimage.io.imread
中设置as_gray=True
,即可将输入的彩色图像转换为灰度图像。然后您可以按原样使用其余代码。 - 使用一些“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
----------------------------------------