在图像上使用Skimage自适应阈值并获得输出

时间:2017-12-05 18:10:36

标签: python image-processing scikit-image image-thresholding

我正在尝试在我的图像上使用scikit-image的自适应阈值。我从HERE

测试了他们的示例代码
import matplotlib.pyplot as plt

from skimage import data
from skimage.filters import threshold_otsu, threshold_adaptive


image = data.page()

global_thresh = threshold_otsu(image)
binary_global = image > global_thresh

block_size = 35
binary_adaptive = threshold_adaptive(image, block_size, offset=10)

fig, axes = plt.subplots(nrows=3, figsize=(7, 8))
ax0, ax1, ax2 = axes
plt.gray()

ax0.imshow(image)
ax0.set_title('Image')

ax1.imshow(binary_global)
ax1.set_title('Global thresholding')

ax2.imshow(binary_adaptive)
ax2.set_title('Adaptive thresholding')

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

plt.show()

代码接收样本图像,对其进行阈值处理并使用plt显示它。但是,我试图检索阈值图像的numpy数组。当我尝试在变量cv2.imwrite上使用binary_global时,它不起作用。打印出binary_global时 - 它实际上是一个由False和True值组成的数组,而不是数字。我不确定plt如何使用它并生成图像。无论如何,我如何对图像进行阈值处理并使用RGB值检索新的阈值图像阵列?

1 个答案:

答案 0 :(得分:0)

首先需要将scikit图像转换为opencv才能使用cv2.imwrite()

添加以下更改 -

from skimage import img_as_ubyte
import matplotlib.pyplot as plt
from skimage import data
from skimage.filters import threshold_otsu, threshold_adaptive
import cv2


image = data.page()

global_thresh = threshold_otsu(image)
binary_global = image > global_thresh

block_size = 35
binary_adaptive = threshold_adaptive(image, block_size, offset=10)

fig, axes = plt.subplots(nrows=3, figsize=(7, 8))
ax0, ax1, ax2 = axes
plt.gray()

ax0.imshow(image)
ax0.set_title('Image')

ax1.imshow(binary_global)
ax1.set_title('Global thresholding')

ax2.imshow(binary_adaptive)
ax2.set_title('Adaptive thresholding')

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

plt.show()
img = img_as_ubyte(binary_global)
cv2.imshow("image", img)
cv2.waitKey(0)

然后,您可以使用img进行写作等。