简体   繁体   English

用于 C++ 图像分析的 OpenCV 二进制图像掩码

[英]OpenCV Binary Image Mask for Image Analysis in C++

I'm trying to analyse some images which have a lot of noise around the outside of the image, but a clear circular centre with a shape inside.我正在尝试分析一些图像,这些图像在图像外部有很多噪音,但内部有一个清晰的圆形中心。 The centre is the part I'm interested in, but the outside noise is affecting my binary thresholding of the image.中心是我感兴趣的部分,但外部噪声正在影响我对图像的二进制阈值处理。

To ignore the noise, I'm trying to set up a circular mask of known centre position and radius whereby all pixels outside this circle are changed to black.为了忽略噪音,我试图设置一个已知中心位置和半径的圆形遮罩,由此该圆圈外的所有像素都变为黑色。 I figure that everything inside the circle will now be easy to analyse with binary thresholding.我认为圆圈内的所有内容现在都可以很容易地使用二进制阈值进行分析。

I'm just wondering if someone might be able to point me in the right direction for this sort of problem please?我只是想知道是否有人能够为我指出解决此类问题的正确方向? I've had a look at this solution: How to black out everything outside a circle in Open CV but some of my constraints are different and I'm confused by the method in which source images are loaded.我看过这个解决方案: 如何在 Open CV 中将圆圈外的所有内容涂黑,但我的一些约束不同,我对加载源图像的方法感到困惑。

Thank you in advance!先感谢您!

//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);

Then do your further processing on your dstImage .然后对您的dstImage进一步处理。 Assume this is your source image:假设这是您的源图像:

在此处输入图片说明

Then the above code gives you this as gray scale input:然后上面的代码给你这个作为灰度输入:

在此处输入图片说明

And this is the binary mask you created:这是您创建的二进制掩码:

在此处输入图片说明

And this is your final result after masking operation:这是屏蔽操作后的最终结果:

在此处输入图片说明

Since you are looking for a clear circular center with a shape inside, you could use Hough Transform to get that area- a careful selection of parameters will help you get this area perfectly.由于您正在寻找内部有形状的清晰圆形中心,您可以使用霍夫变换来获得该区域 - 仔细选择参数将帮助您完美地获得该区域。

A detailed tutorial is here: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html详细教程在这里: http : //docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

For setting pixels outside a region black:设置黑色区域外的像素:

Create a mask image : cv::Mat mask(img_src.size(),img_src.type());创建一个蒙版图像: cv::Mat mask(img_src.size(),img_src.type());

Mark the points inside with white color :用白色标记里面的点:

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

You can now use bitwise_AND and thus get an output image with only the pixels enclosed in mask.您现在可以使用 bitwise_AND 从而获得仅包含在掩码中的像素的输出图像。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM