How to blur the image according to segmentation map

落花浮王杯 提交于 2019-12-11 12:09:26

问题


Forgive me if I am unable to explain well because I am not native speaker.

I am working on blurring the part of image according to the white part of segmentation map. For example here is my segmentation image ( bmp image ). .

Now what I want is to blur the part of original image where the pixels are white in the segmentation map. I just wrote the following code to so.

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))

Please help me, Thanks.


回答1:


You can do it in the following steps:

  1. Load original image and mask image.
  2. Blur the whole original image and save it in a different variable.
  3. Use np.where() method to select the pixels from the mask where you want blurred values and then replace it.

See the sample code below:

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)



回答2:


Here's an alternative to the solution proposed by @Chris Henri. It relies on scipy.ndimage.filters.gaussian_filter and NumPy's boolean indexing:

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)



来源:https://stackoverflow.com/questions/55039717/how-to-blur-the-image-according-to-segmentation-map

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!