逐块模糊图像

Blurring an image tile-by-tile

本文关键字:图像 模糊      更新时间:2023-10-16

我试图分割输入图像并逐块模糊它,但在对相邻块进行所有cv::blur调用后,我得到了边界像素,这与同时将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之外但图像内部的像素可以用于过滤操作

(摘自:请参阅FilterEngine::此处应用描述)

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:帮助着色源代码会很有帮助。

您看到的问题是因为您试图在适当的位置执行此操作。一旦模糊了图像的一部分,那么就使模糊图像任何相邻部分所需的源像素无效。解决方案是不在适当的位置执行此操作,以便原始源像素可用于要模糊的图像的任何部分。