2014-06-12 119 views
9

是否可以僅使用OpenCV模糊圖像的子區域而不是整個圖像來節省一些計算成本?高斯模糊與OpenCV:只模糊圖像的子區域?

謝謝!

編輯:重要的一點是,當模糊分區域的邊界時,應儘可能使用現有的圖像內容;只有當卷積超過原始圖像的邊界時,纔可以使用外推或其他人造邊界條件。

回答

10

模糊的整體形象,假設你想覆蓋原來的(就地過濾支持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)); 
+0

似乎這種方法不關心的邊界 - 它仍然使用某種插值而不是區域外的圖像。我對嗎? – xuhdev

+0

@xuhdev你是對的。我已經添加了一個例子來解決這個問題。如果該區域可能接近一個或兩個包含圖像的邊界,則需要添加一些混亂來應對。 – Bull

+0

@xuhdev,看着過濾器引擎代碼,我現在認爲你可能不對。需要測試。 – Bull

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。 祝你好運,

+0

順便說一句,這個問題有一個C++標記。 C++解決方案的形式與Java的形式完全不同。 – Bull

+0

@B ...對我來說沒關係。從一種語言翻譯到另一種語言很容易。 – xuhdev

+0

一開始沒有注意到,但很高興我能幫到 –