Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Blur a specific part of an image

I have an image. Like this:

enter image description here

I detect a subject(which is a person in this case) & it masks the image like this:

enter image description here

I want the background of the subject to be blurrred. Like this:

enter image description here

Below is the code I have tried. the following code only blurs

import cv2
import numpy as np
from matplotlib import pyplot as plt
import os


path = 'selfies\\'
selfImgs = os.listdir(path)


for image in selfImgs:

    img = cv2.imread(path+image)
    img=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    blur = cv2.blur(img,(10,10))
    #canny = cv2.Canny(blur, 10, 30)

    #plt.imshow(canny)
    plt.imshow(blur)

    j=cv2.cvtColor(blur, cv2.COLOR_BGR2RGB)
    print(image)
    cv2.imwrite('blurred\\'+image+".jpg",j)

Is there any way by which I can blur only specific part/parts of the image.

This project is based on https://github.com/matterport/Mask_RCNN

I can provide more information if required.

I have an approach in numpy :-

final_image = original * mask + blurred * (1-mask)
like image 463
penta Avatar asked Sep 17 '18 10:09

penta


2 Answers

You may use np.where() method to select the pixels where you want blurred values and then replace them as:

import cv2
import numpy as np

img = cv2.imread("/home/user/Downloads/lena.png")
blurred_img = cv2.GaussianBlur(img, (21, 21), 0)

mask = np.zeros((512, 512, 3), dtype=np.uint8)
mask = cv2.circle(mask, (258, 258), 100, np.array([255, 255, 255]), -1)

out = np.where(mask==np.array([255, 255, 255]), img, blurred_img)

cv2.imwrite("./out.png", out)

enter image description here

like image 57
ZdaR Avatar answered Sep 28 '22 04:09

ZdaR


As ZdaR said:

import cv2
import numpy as np

img = cv2.imread("/home/user/Downloads/lena.png")
blurred_img = cv2.GaussianBlur(img, (21, 21), 0)

mask = np.zeros((512, 512, 3), dtype=np.uint8)
mask = cv2.circle(mask, (258, 258), 100, np.array([255, 255, 255]), -1)

out = np.where(mask==np.array([255, 255, 255]), img, blurred_img)

cv2.imwrite("./out.png", out)

This is good idea but I've got same error as penta:

@ZdaR I get TypeError: Scalar value for argument 'color' is not numeric

A simple solution is to modify color value when you create Circle:

mask = cv2.circle(mask, (258, 258), 100, (255, 255,255), -1)

just CHANGE np.array([255,255,255]) to (255,255,255).

like image 29
nima farhadi Avatar answered Sep 28 '22 03:09

nima farhadi