用于 C++ 图像分析的 OpenCV 二进制图像掩码
OpenCV Binary Image Mask for Image Analysis in C++
我正在尝试分析一些图像,这些图像在图像外部周围有很多噪点,但内部有一个清晰的圆形中心和一个形状。中心是我感兴趣的部分,但外部噪声影响了我对图像的二进制阈值处理。
为了忽略噪音,我尝试设置一个已知中心位置和半径的圆形遮罩,从而使该圆圈外的所有像素都变为黑色。我认为圆圈内的所有内容现在都可以通过二进制阈值轻松分析。
我只是想知道是否有人可以为我指明解决此类问题的正确方向?我看过这个解决方案:How to black out everything outside a circle in Open CV 但我的一些限制不同,我对加载源图像的方法感到困惑。
提前致谢!
//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
进行进一步处理。假设这是您的源图像:
然后上面的代码给你这个作为灰度输入:
这是您创建的二进制掩码:
这是掩码操作后的最终结果:
由于您正在寻找一个内部有形状的清晰圆形中心,您可以使用霍夫变换来获得该区域 - 仔细选择参数将帮助您完美地获得该区域。
详细教程在这里:
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);
我正在尝试分析一些图像,这些图像在图像外部周围有很多噪点,但内部有一个清晰的圆形中心和一个形状。中心是我感兴趣的部分,但外部噪声影响了我对图像的二进制阈值处理。
为了忽略噪音,我尝试设置一个已知中心位置和半径的圆形遮罩,从而使该圆圈外的所有像素都变为黑色。我认为圆圈内的所有内容现在都可以通过二进制阈值轻松分析。
我只是想知道是否有人可以为我指明解决此类问题的正确方向?我看过这个解决方案:How to black out everything outside a circle in Open CV 但我的一些限制不同,我对加载源图像的方法感到困惑。
提前致谢!
//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
进行进一步处理。假设这是您的源图像:
然后上面的代码给你这个作为灰度输入:
这是您创建的二进制掩码:
这是掩码操作后的最终结果:
由于您正在寻找一个内部有形状的清晰圆形中心,您可以使用霍夫变换来获得该区域 - 仔细选择参数将帮助您完美地获得该区域。
详细教程在这里: 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);