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

C++ 用于C+中图像分析的OpenCV二进制图像掩码+;,c++,opencv,image-processing,mask,threshold,C++,Opencv,Image Processing,Mask,Threshold,我试图分析一些图像,这些图像的外部有很多噪音,但内部有一个清晰的圆形中心。中心是我感兴趣的部分,但是外部的噪声影响了我对图像的二值阈值处理 为了忽略噪声,我试着设置一个已知中心位置和半径的圆形遮罩,在这个圆形之外的所有像素都会变成黑色。我认为,现在圆内的所有内容都可以通过二进制阈值轻松分析 我只是想知道是否有人能为我指出解决这类问题的正确方向?我已经看过这个解决方案:但是我的一些约束是不同的,我对加载源图像的方法感到困惑 提前谢谢你 //First load your source image,

我试图分析一些图像,这些图像的外部有很多噪音,但内部有一个清晰的圆形中心。中心是我感兴趣的部分,但是外部的噪声影响了我对图像的二值阈值处理

为了忽略噪声,我试着设置一个已知中心位置和半径的圆形遮罩,在这个圆形之外的所有像素都会变成黑色。我认为,现在圆内的所有内容都可以通过二进制阈值轻松分析

我只是想知道是否有人能为我指出解决这类问题的正确方向?我已经看过这个解决方案:但是我的一些约束是不同的,我对加载源图像的方法感到困惑

提前谢谢你

//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);
然后对
dst图像进行进一步处理。假设这是您的源映像:

然后,上述代码将此作为灰度输入:

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

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


由于您正在寻找一个内部有形状的清晰圆心,因此可以使用Hough变换获得该区域-仔细选择参数将帮助您完美地获得该区域

详细教程如下:

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

创建遮罩图像:
cv::Mat mask(img_src.size(),img_src.type())

用白色标记内部的点:

cv::圆(遮罩、中心、半径、cv::标量(255255),-1,8,0)

您现在可以使用按位_,从而获得仅包含在遮罩中的像素的输出图像


cv::按位和(掩码、img\u src、输出)

上传一些清晰描述您的问题的示例图像。非常感谢!这正是我要找的!完美的也谢谢你的帮助。非常感谢。