是否可以僅使用OpenCV模糊圖像的子區域而不是整個圖像來節省一些計算成本?高斯模糊與OpenCV:只模糊圖像的子區域?
謝謝!
編輯:重要的一點是,當模糊分區域的邊界時,應儘可能使用現有的圖像內容;只有當卷積超過原始圖像的邊界時,纔可以使用外推或其他人造邊界條件。
是否可以僅使用OpenCV模糊圖像的子區域而不是整個圖像來節省一些計算成本?高斯模糊與OpenCV:只模糊圖像的子區域?
謝謝!
編輯:重要的一點是,當模糊分區域的邊界時,應儘可能使用現有的圖像內容;只有當卷積超過原始圖像的邊界時,纔可以使用外推或其他人造邊界條件。
模糊的整體形象,假設你想覆蓋原來的(就地過濾支持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));
是的,可以模糊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。 祝你好運,
似乎這種方法不關心的邊界 - 它仍然使用某種插值而不是區域外的圖像。我對嗎? – xuhdev
@xuhdev你是對的。我已經添加了一個例子來解決這個問題。如果該區域可能接近一個或兩個包含圖像的邊界,則需要添加一些混亂來應對。 – Bull
@xuhdev,看着過濾器引擎代碼,我現在認爲你可能不對。需要測試。 – Bull