2012-04-03 115 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);