Pardonnez-moi si je ne peux pas bien expliquer parce que je ne suis pas natif.

Je travaille sur le floutage de la partie de l'image en fonction de la partie blanche de la carte de segmentation. Par exemple voici mon image de segmentation ( image bmp ). image segmentée.

Maintenant, ce que je veux, c'est flouter la partie de l'image d'origine où les pixels sont blancs dans la carte de segmentation. Je viens d'écrire le code suivant pour cela.

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

S'il vous plaît, aidez-moi, merci.

1
Muhammad Rafique 7 mars 2019 à 11:58

2 réponses

Meilleure réponse

Vous pouvez le faire dans les étapes suivantes:

  1. Charger l'image d'origine et l'image de masque.
  2. Flou toute l'image originale et enregistrez-la dans une variable différente.
  3. Utilisez la méthode np.where () pour sélectionner les pixels du masque où vous souhaitez des valeurs floues, puis remplacez-le.

Voir l'exemple de code ci-dessous:

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 Henry 8 mars 2019 à 04:54

Voici une alternative à la solution proposée par @Chris Henri. Il s'appuie sur scipy.ndimage.filters.gaussian_filter et indexation booléenne :

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
Tonechas 7 mars 2019 à 17:40