【问题标题】:Image segmentation based on binary image [closed]基于二值图像的图像分割
【发布时间】:2017-08-05 08:07:59
【问题描述】:

我有这两张图片,image 1image 2 的二进制。

我想从 image 2 中分割出 image 1 形状的对象。

           image 1                            image 2

我查看了几个示例,但没有一个是有帮助的。考虑将图像 2 覆盖到图像 1 的白色区域,使用带有条件的 copyTo 函数,但我相信有更好的方法。如果有人能告诉我解决这个问题的方法或 C++ sn-p 代码,我将不胜感激!

【问题讨论】:

  • 代码在哪里??你尝试了什么??
  • 你可以试试图片蒙版...
  • @Christophe 我想将图像 2 覆盖到图像 1 的白色区域,使用带有条件的 copyTo 函数。但我相信有更好的方法

标签: c++ opencv image-processing image-segmentation edge-detection


【解决方案1】:

是的,你是对的。

如上所述,您可以在 C++ 中执行图像遮罩,而不是使用复制

cv::bitwise_and(image1, image2, output);

其中image1 是掩码,image2 是原始图像。

对我有用的另一种方法是:

image2.copyTo(image1, image1);

其中image1 是蒙版,image2 是原始图像。结果如下图:

【讨论】:

  • setTo 带面具更清晰。在我看来。
  • @Miki 酷。两者之间是否存在性能问题?还是这两个函数都需要相同的计算时间?
  • 可能一样....我认为“我正在根据这个掩码设置这个值”比“我正在和-ing 这两个图像”更容易混淆
  • @Miki 我实际上尝试了相同的方法并遇到了相同的错误(直到现在)。更改掩蔽通道无法解决该错误。以为我偏离了方向,这就是我要求方法的原因。不过多亏了你的解释,下次我提问的时候会拿出一些证据! :)
  • @Samuel 我看到你已经解决了你的问题。做得好。继续学习!!!
【解决方案2】:

你需要大津阈值来分离前景和背景

/**@file
  Get the Otusu threshold for image segmentation.
  @param[in] gray - the grayscale image
  @param width - image width
  @param height - image height
  @returns Threshold at which to split pixels into foreground and
           background.
  @image html maggie.jpg  Margaret Thatcher (1925-2013) greyscale photograph
  @image html maggieotsu.gif Mrs Thatcher Otsu thresholded
 */
int getOtsuthreshold(unsigned char *grey, int width, int height)
{
  int hist[256] = {0};
  int wB = 0;
  int wF;
  float mB, mF;
  float sum = 0;
  float sumB = 0;
  float varBetween;
  float varMax = 0.0f;
  int answer = 0;
  int i;
  int k;

  for(i=0;i<width*height;i++)
    hist[grey[i]]++;

  /* sum of all (for means) */
  for (k=0 ; k<256 ; k++) 
       sum += k * hist[k];

  for(k=0;k<256;k++)
  {
     wB += hist[k];               
     if (wB == 0) 
         continue;

     wF = width*height - wB;            
     if (wF == 0) 
       break;

     sumB += (float) (k * hist[k]);

     mB = sumB / wB;            /* Mean Background */
     mF = (sum - sumB) / wF;    /* Mean Foreground */

     /* Calculate Between Class Variance */
     varBetween = (float)wB * (float)wF * (mB - mF) * (mB - mF);

     /* Check if new maximum found */
     if (varBetween > varMax) 
     {
       varMax = varBetween;
       answer = k;
     }

  }
  return answer;
}

https://github.com/MalcolmMcLean/binaryimagelibrary

【讨论】:

  • 您确定要回答这个问题吗?即便如此,你也可以使用cv::threshold(..., THRESH_OTSU)...无需外部库
猜你喜欢
  • 2015-09-30
  • 2013-09-29
  • 2014-01-16
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多