模糊图像的特定部分

Posted

技术标签:

【中文标题】模糊图像的特定部分【英文标题】:Blur a specific part of an image 【发布时间】:2019-02-21 05:27:57 【问题描述】:

我有一张图片。像这样:

我检测到一个主题(在这种情况下是一个人),它像这样掩盖图像:

我希望主体的背景模糊。像这样:

以下是我尝试过的代码。下面的代码只是模糊了

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)

有什么方法可以只/部分。

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

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

我在 numpy 中有一个方法:-

final_image = original * mask + blurred * (1-mask)

【问题讨论】:

你要做的是模糊整个图像,然后根据掩码将原始图像和模糊图像组合起来(例如,参见this question)。 【参考方案1】:

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

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

@ZdaR 我得到 TypeError: Scalar value for argument 'color' is not numeric

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

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

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

【讨论】:

【参考方案2】:

您可以使用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)

【讨论】:

没错。使用掩码是最常见和最有效的方式。 @ZdaR 我得到 TypeError: Scalar value for argument 'color' is not numeric 在哪一行代码,也许你安装了一些不同版本的 OpenCV,代码可能需要微调。你能分享完整的回溯吗? @ZdaR,就我而言,我需要在全球范围内将np.array([255, 255, 255]) 替换为(255, 255, 255)。使用 opencv-python==4.1.0.25.

以上是关于模糊图像的特定部分的主要内容,如果未能解决你的问题,请参考以下文章

当用户触摸屏幕时,删除图像上的模糊效果[关闭]

模糊图像的阈值 - 第 2 部分

在 QML/Qt 中模糊部分背景图像

<div> 使用 css 模糊部分背景图像

图像去雾基于matlab偏振水下模糊图像去雾含Matlab源码 396期

用 OCR 识别的文本对图像进行去模糊处理