如何分离灰度图像等于阈值的区域?

时间:2019-06-07 18:03:19

标签: python numpy opencv matplotlib

我正在尝试提取灰度图像的像素值等于阈值的那些区域。真的可以使用numpy函数来做到这一点。

我已经尝试过:

ig=cv2.imread("000000000078.png")
b= np.where(ig>84)
print(b)
plt.imshow(b[0])

输出为:

(array([  0,   0,   0, ..., 611, 611, 611]), array([  0,   0,   0, ..., 611, 611, 611]), array([0, 1, 2, ..., 0, 1, 2]))

是数组的元组。我尝试绘制b [0],但没有产生我所需的区域。还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

有几个问题。首先

ig=cv2.imread("000000000078.png")

为您提供3通道图像,而不是灰度图像。您需要将其灰度加载:

ig = cv2.imread("000000000078.png", cv2.IMREAD_GRAYSCALE)

然后,您可以使用以下任一方法进行阈值设置:

mask = cv2.threshold(ig, 84, 255, cv2.THRESH_BINARY)

或:

mask = np.uint8(ig>84)

然后可以将区域提取为:

filtered_img = cv2.bitwise_and(ig, ig, mask=mask)

plt.imshow(filtered_img)

答案 1 :(得分:1)

  

...提取像素值为等于的灰度图像的那些区域。

您可以使用NumPy的equal完成工作。

import numpy as np
from skimage import io
import matplotlib.pyplot as plt

img = io.imread('https://i.stack.imgur.com/qFzHW.png')

threshold = 32
region = np.equal(img, threshold)

fig, ax = plt.subplots(1, 2)
ax[0].imshow(img, cmap='gray')
ax[1].imshow(region, cmap='gray')
for a in ax:
    a.set_axis_off()
plt.show(fig)

results

请注意,出于演示目的,已对摄影师图像进行了量化,以使img中只有4个不同的强度值,即32、64、96和128。

根据评论,我猜想OP希望使用region作为PNG图像的透明层蒙版。这是这样做的相关代码:

separate = np.stack([img, img, img, 255*np.uint8(region)], axis=-1)
io.imsave("filename.png", separate)