OpenCV filter2D在非矩形ROI内

时间:2016-05-25 20:09:07

标签: c++ opencv

我有一个图像,其中只有一个小的非矩形部分是有用的。我有一个二进制掩码,表明有用的ROI。

如何将OpenCV中的cv::filter2D仅应用于由二进制掩码定义的ROI?

修改

我在ROI之外的像素的值为0.另一个的浮点值约为300-500,因此ROI边界中filter2D的问题具有较高的值转换。

将ROI外部的像素值设置为ROI内最近的像素也是可以接受的,类似于cv::BORDER_REPLICATE

1 个答案:

答案 0 :(得分:0)

可能是这样的。我认为边框面具附近没有问题

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc, char* argv[])
{
Mat m = imread("f:/lib/opencv/samples/data/lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);

Mat mask=Mat::zeros(m.size(), CV_8UC1),maskBlur,mc;
// mask is a disk
circle(mask, Point(200, 200), 100, Scalar(255),-1);

Mat negMask;
// neg mask
bitwise_not(mask, negMask);
circle(mask, Point(200, 200), 100, Scalar(255), -1);
Mat md,mdBlur,mdint;

m.copyTo(md);

// All pixels outside mask set to 0
md.setTo(0, negMask);
imshow("mask image", md);
// Convert image to int
md.convertTo(mdint, CV_32S);
Size fxy(13, 13);
blur(mdint, mdBlur, fxy);
mdBlur.convertTo(mc, CV_8U);
imshow("Blur without mask", mc);
imwrite("blurwithoutmask.jpg",mc);
mask.convertTo(maskBlur, CV_32S);
// blur mask
blur(maskBlur, maskBlur, fxy);
Mat mskB;
mskB.setTo(1, negMask);
divide(mdBlur,maskBlur/255,mdBlur);

mdBlur.convertTo(mc, CV_8U);
imshow("Blur with mask", mc);
imwrite("blurwithmask.jpg",mc);
waitKey();

}