删除背景后从位图中删除剩余部分

时间:2015-02-24 09:11:12

标签: c# visual-studio-2012 bitmap

我有这个图像,我想删除背景以隔离绿色图片。背景不是完全黑色,而是包含一些像素,这些像素具有与绿色图片内的其他像素相同的颜色。 enter image description here 我用过这个

    private void ButtonFilterClick(object sender, EventArgs e)
{
  PixelFormat pxf = PixelFormat.Format24bppRgb;
  Bitmap bitmap = ((Bitmap)(_smartLabForm.pictureBox1.Image));
  Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
  BitmapData bmpData =
  bitmap.LockBits(rect, ImageLockMode.ReadWrite, pxf);
  IntPtr ptr = bmpData.Scan0;
  int numBytes = bmpData.Stride * bitmap.Height;
  byte[] rgbValues = new byte[numBytes];
  Marshal.Copy(ptr, rgbValues, 0, numBytes);
  for (int counter = 0; counter < rgbValues.Length; counter += 3)
  {
    if (rgbValues[counter] < 15 &&
        rgbValues[counter + 1] < 15 &&
        rgbValues[counter + 2] < 15)
    {
      rgbValues[counter] = 255;
      rgbValues[counter + 1] = 255;
      rgbValues[counter + 2] = 255;
    }
  }
  Marshal.Copy(rgbValues, 0, ptr, numBytes);
  bitmap.UnlockBits(bmpData);
  _smartLabForm.Refresh();
}

我得到的是这个: enter image description here

如何删除&#34;噪音&#34;保持不损坏绿色图片而不影响性能? 谢谢?

1 个答案:

答案 0 :(得分:1)

这实际上是计算机视觉中一个非常复杂的主题(image segmentation)。涵盖先进技术将过于宽泛。但是这里可以快速而简单地完成工作:

将阈值提高到足以使所有背景像素都低于它。当检查是否应该移除像素时,还将特定邻域中的所有像素(例如,圆形半径)与阈值进行比较。只有在全部低于阈值时才会将其删除。

这样,当您靠近要素区域时,可以不那么激烈地移除像素。