2015-07-22 144 views
2

我正试图分析一些图像,这些图像在图像的外部有很多噪点,但里面有一个形状清晰的圆形中心。该中心是我感兴趣的部分,但外部噪声正在影响我对图像的二进制阈值。用于C++图像分析的OpenCV二进制图像蒙版

要忽略噪声,我试图设置一个已知中心位置和半径的圆形掩膜,从而将该圆圈外的所有像素都更改为黑色。我认为圈内的一切现在都可以通过二进制阈值进行分析。

我只是想知道如果有人能够指出我对这类问题的正确方向吗?我已经看过这个解决方案:How to black out everything outside a circle in Open CV但我的一些约束是不同的,我很困惑的源图像加载方法。

预先感谢您!

+0

上传部分样本图片,并附上您的问题的描述。 –

回答

14
//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.rows/2, mask.cols/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

这是您的隐藏操作后的最终结果N:

enter image description here

+0

非常感谢!这正是我所期待的!完善! – MSTTm

3

由于您使用的是形状内寻找一个清晰的圆形中心,你可以使用霍夫变换来获取面积 - 参数的精心选择将帮助你完全得到这个区域。

详细教程这里: 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);

您现在可以使用bitwise_AND,从而获得仅包含在蒙版中的像素的输出图像。

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

+1

也谢谢你的帮助。非常感激。 – MSTTm