C++中使用OpenCV二进制图像掩码进行图像分析

9
我试图分析一些图片,这些图片周围有很多噪点,但是中心部分很清晰,包含一个形状。我感兴趣的是中心部分,但是外部噪音影响了我的二值阈值化处理。
为了忽略这些噪音,我正在尝试设置一个已知中心位置和半径的圆形遮罩,在这个圆形之外的所有像素都会变成黑色。我想,现在圆形内的所有内容都可以通过二值阈值化轻松分析。
我只是想知道,是否有人可以指导我解决这类问题?我已经看过了这个解决方案:如何在Open CV中使圆形之外的所有内容变黑,但我的一些限制条件不同,并且我对加载源图像的方法感到困惑。
提前感谢您!

请上传一些样例图片,并附上清晰的问题描述。 - Balaji R
2个回答

30
//First load your source image, here load as gray scale
cv::Mat srcImage = cv::imread("sourceImage.jpg", CV_LOAD_IMAGE_GRAYSCALE);

//Then define your mask image
cv::Mat mask = cv::Mat::zeros(srcImage.size(), srcImage.type());

//Define your destination image
cv::Mat dstImage = cv::Mat::zeros(srcImage.size(), srcImage.type());    

//I assume you want to draw the circle at the center of your image, with a radius of 50
cv::circle(mask, cv::Point(mask.cols/2, mask.rows/2), 50, cv::Scalar(255, 0, 0), -1, 8, 0);

//Now you can copy your source image to destination image with masking
srcImage.copyTo(dstImage, mask);

然后在您的dstImage上进行进一步处理。假设这是您的源图像:

enter image description here

然后上述代码将以灰度输入的形式呈现:

enter image description here

这是您创建的二进制掩码:

enter image description here

这是掩码操作后的最终结果:

enter image description here


非常感谢! 这正是我需要的!完美! - MSTTm

4

如果你想要在一个圆形中心内有一个形状,请使用霍夫变换来得到这个区域 - 仔细选择参数将帮助您完美地得到这个区域。

这里有一个详细的教程: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

要将区域外的像素设置为黑色:

创建一个掩模图像: cv::Mat mask(img_src.size(),img_src.type());

用白色标记内部点:

cv::circle( mask, center, radius, cv::Scalar(255,255,255),-1, 8, 0 );

现在,你可以使用位运算 AND 并得到一个只包含在掩模中的像素的输出图像。

cv::bitwise_and(mask,img_src,output);


1
谢谢你的帮助。非常感激。 - MSTTm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接