【问题标题】:OpenCV Binary Image Mask for Image Analysis in C++用于 C++ 中图像分析的 OpenCV 二进制图像掩码
【发布时间】:2015-10-11 19:12:42
【问题描述】:

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

为了忽略噪音,我试图设置一个已知中心位置和半径的圆形遮罩,从而将这个圆外的所有像素都更改为黑色。我认为现在可以通过二进制阈值轻松分析圆圈内的所有内容。

我只是想知道是否有人可以为我指出此类问题的正确方向?我看过这个解决方案:How to black out everything outside a circle in Open CV,但我的一些约束是不同的,我对加载源图像的方法感到困惑。

提前谢谢你!

【问题讨论】:

  • 上传一些对您的问题有清晰描述的示例图片。

标签: c++ opencv image-processing mask threshold


【解决方案1】:
//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 进行进一步处理。假设这是您的源图像:

然后上面的代码给你这个灰度输入:

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

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

【讨论】:

  • 非常感谢!这正是我想要的!完美!
【解决方案2】:

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

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

【讨论】:

  • 也感谢您的帮助。非常感谢。
猜你喜欢
  • 2022-01-09
  • 2020-04-13
  • 2018-09-27
  • 1970-01-01
  • 2017-04-10
  • 2018-07-21
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多