【问题标题】:number of distinct regions in the binary image (c++)二值图像中不同区域的数量(c++)
【发布时间】:2017-07-17 09:36:55
【问题描述】:

我将黑白图像分成 4 段。我需要知道每个细分市场有 多少 个区域。

这里有一个更好解释的例子。

我想知道在任何最流行的 c++ 图像处理库中是否有现成的 API 可用? (比如gd、cimg、opencv?)

【问题讨论】:

  • 我猜你可以选择一个随机点和填充。检查所有像素是否为黑色或泛色,如果不是,请选择另一个随机的、未着色的点并用另一种颜色进行泛色填充。重复直到没有无色像素,同时计算需要多少次迭代。
  • 实际上,您不需要选择随机像素,它可以很容易地确定,您可以从左上角向下扫描。
  • 感谢您的评论,但我正在从一些可用的图像处理库中寻找完整的解决方案。

标签: c++ opencv image-processing ocr gd


【解决方案1】:

您可以只使用 OpenCV 的connectedComponents() 并且您寻求的答案比它返回的数字小一:

#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char** argv)
{
    if(argc!=2){
      std::cerr << "ERROR: Please supply an image name" << std::endl;
      exit(1);
    }

    // Load up the image and check
    Mat image = imread(argv[1], IMREAD_GRAYSCALE);
    if(image.empty()){
      std::cerr << "ERROR: Unable to load image" << std::endl;
      exit(1);
    }

    // Calculate connected components
    Mat label;
    int n=connectedComponents(image,label,8,CV_16U);
    std::cout << "n=" << n << std::endl;
}

返回 5。


返回 4。


返回 3。


返回 3。

【讨论】:

  • 感谢您的帮助。但是,我对此图像的答案不正确。 ibb.co/iAW0Va我已经将您的代码扩展为将图像切片到小区域codepaste.net/pbnjm6 p.s.抱歉,保存得太早了。
  • 你得到了什么答案?你用了什么图片?
  • 这是我从第一个切片中得到的图像。 ibb.co/iLAAVa 你可以看到区域是 2,但是 italic connectedComponents-1 italic 说它是 1。
  • 英国来晚了,明天再看。请尝试一些非常简单的图像,其中一个,然后是两个不同的正方形或圆圈,看看您是否可以隔离错误。也可以尝试在白色背景上使用黑色线条,就像您的问题所暗示的那样 - 所以我的意思是首先将您的图像设置为纯黑色和白色。
  • 哦,我想我知道发生了什么事 - 线条比我从示例中预期的要细,这允许填充流过线条,从而连接两个应该分开的区域。你可以尝试稍微粗一点的线条,或者对它们进行形态扩张,看看是否有帮助?
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2022-01-18
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2016-02-28
  • 2018-08-13
相关资源
最近更新 更多