Как разделить области изображения GrayScale равными пороговому значению? - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь извлечь те области серого изображения, значение пикселя которых равно пороговому значению. Можно ли действительно сделать это, используя 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 ]

2 голосов
/ 07 июня 2019

Есть несколько проблем. Во-первых

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 голос
/ 07 июня 2019

... извлечь те области серого изображения, значение пикселя которых равно , равное пороговому значению.

Вы можете выполнить работу, используя NumPy's 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)
* +1012 *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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...