我正在尝试提取灰度图像的像素值等于阈值的那些区域。真的可以使用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],但没有产生我所需的区域。还有其他选择吗?
答案 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)
请注意,出于演示目的,已对摄影师图像进行了量化,以使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)