Как размыть изображение по карте сегментации - PullRequest
1 голос
/ 07 марта 2019

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

Я работаю над размытием части изображения в соответствии с белой частью карты сегментации.Например, вот мое изображение сегментации (изображение BMP).segmented image.

Теперь мне нужно размыть ту часть исходного изображения, где пиксели белого цвета на карте сегментации.Я только что написал следующий код:

mask = mask >= 0.5
mask = np.reshape(mask, (512, 512))

mh, mw = 512, 512
mask_n = np.ones((mh, mw, 3))

mask_n[:,:,0] *= mask
mask_n[:,:,1] *= mask
mask_n[:,:,2] *= mask

# discard padded area
ih, iw, _ = image_n.shape

delta_h = mh - ih
delta_w = mw - iw

top = delta_h // 2
bottom = mh - (delta_h - top)
left = delta_w // 2
right = mw - (delta_w - left)

mask_n = mask_n[top:bottom, left:right, :]


# addWeighted
image_n = image_n *1 +   cv2.blur(mask_n * 0.8, (800, 800))

Пожалуйста, помогите мне, спасибо.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Вот альтернатива решению, предложенному @Chris Henri. Он полагается на scipy.ndimage.filters.gaussian_filter и логическое индексирование NumPy :

from skimage import io
import numpy as np
from scipy.ndimage.filters import gaussian_filter
import matplotlib.pyplot as plt

mask = io.imread('https://i.stack.imgur.com/qJiKf.png')
img = np.random.random(size=mask.shape[:2])
idx = mask.min(axis=-1) == 255
blurred = gaussian_filter(img, sigma=3)
blurred[~idx] = 0

fig, axs = plt.subplots(1, 3, figsize=(12, 4))
for ax, im in zip(axs, [img, mask, blurred]):
    ax.imshow(im, cmap='gray')
    ax.set_axis_off()
plt.show(fig)

plots

1 голос
/ 07 марта 2019

Вы можете сделать это в следующие шаги:

  1. Загрузить исходное изображение и изображение маски.
  2. Размыть все исходное изображение и сохранить его в другой переменной.
  3. Используйте метод np.where (), чтобы выбрать пиксели в маске, где вы хотите получить размытые значения, а затем заменить их.

См. Пример кода ниже:

import cv2
import numpy as np

img = cv2.imread("./image.png")
blurred_img = cv2.GaussianBlur(img, (21, 21), 0)
mask = cv2.imread("./mask.png")

output = np.where(mask==np.array([255, 255, 255]), blurred_img, img)
cv2.imwrite("./output.png", output)
...