2012-04-21 102 views
1

我需要帮助从图像中提取指定的颜色(例如红色),然后裁剪包含此颜色的对象。如何在C#中使用代码进行颜色提取?

这部分在我的研究生项目中非常重要,它跟踪投影仪屏幕上的激光手势。

+2

当你说裁剪,你的意思是......?你想删除红框?你想让图像中的所有红色变成白色/透明/等? – SimpleVar 2012-04-21 09:48:07

+0

我的意思是用指定的颜色剪裁物体 – user2012 2012-04-21 10:09:27

+0

例如红色的球在图像中 – user2012 2012-04-21 10:12:52

回答

1

我真的不确定我是否正确地理解了你,但是这里有一个代码只能让图像的红色部分可见。

与200相比,您可以通过将其更改为<来将其更改为仅显示不可见的红色部分。 您也可以玩数字200来查看什么阈值适合您的红色检查。

private static unsafe void OnlyRed(Bitmap bitmap, Color replacement) 
{ 
    var redOffset = 0; 
    var bpp = 32; 
    var bytesRep = new List<byte> {replacement.R, replacement.G, replacement.B}; 

    switch (bitmap.PixelFormat) 
    { 
     case PixelFormat.Format24bppRgb: 
      bpp = 24; 
      break; 
     case PixelFormat.Format32bppArgb: 
      redOffset = 8; 
      bytesRep.Insert(0, replacement.A); 
      break; 
     case PixelFormat.Format32bppRgb: 
     case PixelFormat.Canonical: 
      bytesRep.Add(replacement.A); 
      break; 
     default: 
      throw new NotSupportedException("Pixel format unsupported."); 
    } 

    var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
           ImageLockMode.ReadWrite, 
           bitmap.PixelFormat); 

    var start = (byte*)data.Scan0; 
    var end = start + data.Height * data.Stride; 

    for (var curr = start; curr < end; curr += bpp/8) 
    { 
     if (curr[redOffset] > 200) 
     { 
      continue; 
     } 

     for (var i = 0; i < bytesRep.Count; i++) 
     { 
      curr[i] = bytesRep[i]; 
     } 
    } 

    bitmap.UnlockBits(data); 
} 

用法:

var bitmap = new Bitmap("file location..."); 
OnlyRed(bitmap, Color.Transparent); 
+0

不会与我一起工作 – user2012 2012-04-24 08:50:59

+0

什么是不正确的?你是否遇到异常?结果是否错误?怎么样? – SimpleVar 2012-04-25 07:53:31

+0

我有图像http://www.mediafire.com/imageview.php?quickkey=ey2r55xu331gbtl 我需要在C#中的代码找出图像中的黑色矩形,然后剪切区域中的一面 – user2012 2012-05-03 15:13:54

相关问题