逐层模糊图像

时间:2014-10-09 16:00:15

标签: c++ opencv

我尝试对输入图像进行分段并逐层模糊,但在相邻图块上的所有cv::blur次调用后,我都有边框像素,这与I&#不同39;当你同时将cv::blur集体应用于整个图像时得到了。

Mat upper(im, Rect( 0,0, 10,10 ));
Mat lower(im, Rect( 0,11, 10,20 ))

blur( upper, upper, Size( 5, 5 ) );
blur( lower, lower, Size( 5, 5 ) );

看起来我使用的库版本(2.4.8)没有做到我期望通过以下内容阅读:

  

与早期版本的OpenCV不同,现在过滤操作完全支持图像ROI的概念,即ROI之外的像素,但图像内部的像素可用于过滤操作

(摘自:See FilterEngine::apply description here

P.S.1:我尝试提取cv::boxFilter实现并更改srcRoi参数值,但也有错误的结果。

Mat src = im.clone();
Mat dst = src; // Trying to perform the operation in-place

Size ksize( 5, 5 );
Point anchor(-1,-1);

Ptr<FilterEngine> f = createBoxFilter( 
  src.type(), dst.type(),
  ksize, anchor, true, BORDER_DEFAULT 
);

f->apply( 
  src, dst, 
  Rect(0,0,10,10), 
  Point(0,0), false 
);
f->apply( 
  src, dst, 
  Rect(0,0,10,10), 
  Point(0,11), false 
);

P.S.2:帮助着色源代码会有所帮助。

1 个答案:

答案 0 :(得分:3)

您遇到的问题是因为您正在尝试就地执行此操作。一旦您模糊了部分图像,您就会使模糊图像的任何相邻部分所需的源像素无效。解决方案是不要就地执行此操作,以便原始源像素可用于您想要模糊的图像的任何部分。