2012-04-03 69 views
1

我正在使用C++ openCV api,并且我想选择性地仅模糊图像中的某些像素。做这个的最好方式是什么?我试图通过子矩阵来做到这一点,但一直未能实现。OpenCV筛选部分图像

//5 is the 'radius' i'm blurring (~1/2 kernel width) 
cv::Rect srcRect; 
srcRect.x = x - 5; 
srcRect.y = y - 5; 
srcRect.width = 2*5 + 1; 
srcRect.height = 2*5 + 1; 

cv::Rect dstRect; 
dstRect.x = x; 
dstRect.y = y; 
dstRect.width = 1; 
dstRect.height = 1; 

cv::Mat src = srcImage(srcRect); 
cv::Mat dst = dstImage(dstRect); 

cv::blur(src, dst, cv::Size(5,5)); 

通过上面的代码,没有任何变化。

当我将两个矩形设置为srcRect时,子图像都会模糊,但是整个dst会变得模糊,而不仅仅是单个像素。

任何想法?

回答

3

srcdst必须是相同的大小。在你的例子中,dst是一个像素的子区域。

除了构建矩形的方式外,您的代码是正确的。

Rect srcDstRect(7, 7, 100, 100); 
cv::Mat src = srcImage(srcDstRect); 
cv::Mat dst = dstImage(srcDstRect); 

cv::blur(src, dst, cv::Size(5,5)); 
+0

的克隆图像似乎CV ::模糊模糊_all_像素SRC。我基本上想修改一个像素,并将其值设置为其周围所有值的平均值。有任何想法吗? – 2012-04-03 18:22:00

+0

我认为你必须实现你自己的模糊,因为OpenCV有一个内置的边界插值方法。或者让一个单独的图像,像src一样大,按照你的定义保存src,然后复制dst的中心dstImage – Sam 2012-04-03 18:50:37

+1

实际上,在你的代码中,cv :: blur创建一个新的dst矩阵,丢弃一个你设置了,因为它和src不一样大小。你所要做的就是将中心像素复制回dstImage。 – Sam 2012-04-03 18:52:32

0

的输入是原始图像和模糊输入

int x1=1,y1=1,x2=200,y2=200; 

Rect region(x1, y1, x2, y2); 

GaussianBlur(input(region), blur(region), Size(5, 5), x,0);