如何根据分割图模糊图像

问题描述 投票:1回答:2

请原谅我,如果我不能解释得好,因为我不是母语。

我正在根据分割图的白色部分模糊图像的一部分。例如,这是我的分割图像(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))

请帮帮我,谢谢。

python opencv blur image-segmentation
2个回答
1
投票

您可以通过以下步骤执行此操作:

  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)

1
投票

这是@Chris Henri提出的解决方案的替代方案。它依赖于scipy.ndimage.filters.gaussian_filter和NumPy的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)

plots

© www.soinside.com 2019 - 2024. All rights reserved.