简体   繁体   中英

Blur a specific part of an image

I have an image. Like this:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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)

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)

在此处输入图片说明

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

the simple solution is modifying 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) .

I don't know what tools you use for subject detection, but if you have a way to copy the subject, you can first copy the whole image and then blur it. finally, you can copy the subject on the blurred image. if it gives false and true on pixels in oppose to giving borders, you can just bitwise it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM