模糊图像的特定部分

pen*_*nta 4 python opencv image-processing scipy tensorflow

我有一张图片。像这样:

在此处输入图片说明

我检测到一个主体(在这种情况下是一个人),并掩盖了图像,如下所示:

在此处输入图片说明

我想使主体的背景模糊。像这样:

在此处输入图片说明

以下是我尝试过的代码。以下代码仅模糊

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)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以仅模糊图像的特定部分。

该项目基于https://github.com/matterport/Mask_RCNN

如果需要,我可以提供更多信息。

我在numpy中有一种方法:-

final_image = original * mask + blurred * (1-mask)
Run Code Online (Sandbox Code Playgroud)

Zda*_*daR 6

您可以使用np.where()方法选择想要模糊值的像素,然后将其替换为:

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • @ZdaR,在我的情况下,我需要将 `np.array([255, 255, 255])` 全局替换为 `(255, 255, 255)`。使用 opencv-python==4.1.0.25。 (3认同)
  • @ZdaR 我得到 TypeError: 参数“颜色”的标量值不是数字 (2认同)

nim*_*adi 6

正如ZdaR所说:

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)
Run Code Online (Sandbox Code Playgroud)

这是个好主意,但我遇到了与以下相同的错误penta

@ZdaR 我得到 TypeError: 参数“颜色”的标量值不是数字

一个简单的解决方案是在创建 Circle 时修改颜色值:

mask = cv2.circle(mask, (258, 258), 100, (255, 255,255), -1)
Run Code Online (Sandbox Code Playgroud)

只需更改np.array([255,255,255])(255,255,255).