使用OpenCV进行高斯模糊:只模糊图像的子区域?

时间:2014-06-12 22:54:46

标签: opencv

是否可以仅使用OpenCV模糊图像的子区域而不是整个图像,以节省一些计算成本?

编辑:重要的一点是,当模糊子区域的边界时,应尽可能多地使用现有的图像内容;只有当卷积超出原始图像的边界时,才能使用外推法或其他人工边界条件。

4 个答案:

答案 0 :(得分:14)

要模糊整个图像,假设您要覆盖原始图像(cv::GaussianBlur支持支持就地过滤),您将拥有类似

的内容
 cv::GaussianBlur(image, image, Size(0, 0), 4);

要模糊区域,请使用Mat::operator()(const Rect& roi)提取区域:

 cv::Rect region(x, y, w, h);
 cv::GaussianBlur(image(region), image(region), Size(0, 0), 4);

或者如果您想在单独的图像中使用模糊输出:

 cv::Rect region(x, y, w, h);
 cv::Mat blurred_region;
 cv::GaussianBlur(image(region), blurred_region, Size(0, 0), 4);

上面使用了默认的BORDER_CONSTANT选项,它只是假设在模糊时图像外的所有内容都是0。 我不确定它对区域边缘的像素有什么影响。您可以强制它忽略区域外的像素(BORDER_CONSTANT | BORDER_ISOLATE)。所以它认为它可能确实使用了区域外的像素。您需要将上面的结果与以下内容进行比较:

 const int bsize = 10;
 cv::Rect region(x, y, w, h);
 cv::Rect padded_region(x - bsize, y - bsize, w + 2 * bsize, h + 2 * bsize)
 cv::Mat blurred_padded_region;
 cv::GaussianBlur(image(padded_region), blurred_padded_region, Size(0, 0), 4);

 cv::Mat blurred_region = blurred_padded_region(cv::Rect(bsize, bsize, w, h));
 // and you can then copy that back into the original image if you want: 
 blurred_region.copyTo(image(region));

答案 1 :(得分:3)

是的,可以模糊OpenCV中的感兴趣区域。

size( 120, 160 ); 
OpenCV opencv = new OpenCV(this);
opencv.loadImage("myPicture.jpg");
opencv.ROI( 60, 0, 60, 160 );
opencv.blur( OpenCV.BLUR, 13 );   
image( opencv.image(), 0, 0 );

有关详细信息,请查看此link。 祝你好运,

答案 2 :(得分:3)

这是在Python中执行操作的方法。想法是选择一个ROI,对其进行模糊处理,然后将其重新插入图像中

import cv2

# Read in image
image = cv2.imread('1.png')

# Create ROI coordinates
topLeft = (60, 140)
bottomRight = (340, 250)
x, y = topLeft[0], topLeft[1]
w, h = bottomRight[0] - topLeft[0], bottomRight[1] - topLeft[1]

# Grab ROI with Numpy slicing and blur
ROI = image[y:y+h, x:x+w]
blur = cv2.GaussianBlur(ROI, (51,51), 0) 

# Insert ROI back into image
image[y:y+h, x:x+w] = blur

cv2.imshow('blur', blur)
cv2.imshow('image', image)
cv2.waitKey()

->之前

答案 3 :(得分:1)

如果您使用的是bytecode

提供的javacv

那么你可以这样做。它只会模糊特定的投资回报率。

Mat src = imread("xyz.jpg",IMREAD_COLOR);
Rect rect = new Rect(50,50,src.size().width()/3,100);
GaussianBlur(new Mat(src, rect), new Mat(src, rect), new Size(23,23), 30);