使用OpenCV和Python在多边形上应用高斯模糊

时间:2016-12-15 20:36:13

标签: python opencv image-processing gaussianblur

我对OpenCV和Python都很陌生。我需要在使用cv2.findContours获得的轮廓上应用高斯模糊。我已成功应用高斯模糊,但仅适用于矩形。我无法找到任何显示如何将其应用于随机形状轮廓的示例。

我使用的是OpenCV 3.1.0版。

谢谢!

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,这是实际上对我有用的解决方案(它适用于任何轮廓):

import cv2 as cv
import numpy as np

在这里,我定义了示例多边形ROI的顶点列表:

roi_corners = np.array([[(180,300),(120,540),(110,480),(160,350)]],dtype = np.int32)

阅读原始图像:

image = cv.imread('image.jpeg')

创建整个图像的模糊副本:

blurred_image = cv.GaussianBlur(image,(43, 43), 30)

为ROI创建一个蒙版,并用(255,255,255)颜色填充ROI:

mask = np.zeros(image.shape, dtype=np.uint8)
channel_count = image.shape[2]
ignore_mask_color = (255,)*channel_count
cv.fillPoly(mask, roi_corners, ignore_mask_color)

为原始图像中除ROI之外的所有位置创建一个蒙版(因此mask_inverse):

mask_inverse = np.ones(mask.shape).astype(np.uint8)*255 - mask

通过以下方式组合所有蒙版和上方图像:

final_image = cv.bitwise_and(blurred_image, mask) + cv.bitwise_and(image, mask_inverse)

下面是原始图像的示例,其中ROI为倾斜车牌(平行四边形):

original image

和生成的图像:

target polygon (here just a parallelogram) blurred

答案 1 :(得分:0)

你可能会考虑模糊图像无处不在,然后在模糊图像和原始图像之间进行加权平均,其中权重在轮廓区域内是一个,在外面为零:

outImg = img.mul(contourMask) + blurredImg.mul(1-contourMask);

或者,使用copyTo:

outImg = img.clone();
blurredImg.copyTo(outImg,contourMask);