c#从图像中获取矩形边界

时间:2015-07-27 13:43:05

标签: c# image image-processing

假设我有一张图片enter image description here

我想在图像中找到黑色矩形边界(右,左,宽,高)(假设此图像中没有其他黑色像素)。 到目前为止我的代码是:

    private unsafe Bitmap GetDiffBitmap(Bitmap bmp)
        {


            bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);

            IntPtr scan0 = bmData.Scan0;


            int stride = bmData.Stride;


            int nWidth = bmp.Width;
            int nHeight = bmp.Height;

            for(int y = 0; y < nHeight; y++)

            {
                //define the pointers inside the first loop for parallelizing
                byte* p = (byte*)scan0.ToPointer();
                p += y * stride;



                for (int x = 0; x < nWidth; x++)
                {
                    //always get the complete pixel when differences are found

                    if(p[0]==0 && p[1]==0 && p[2]==0)
                    { 
                           // p[0] = 255;
                           // p[1] = 255;
                           // p[2] =255;

                            right = nWidth;//geting the position of the lastest black pixel;

                      }  



                    p += 4;


                }

            }



            bmp.UnlockBits(bmData);


            return bmp;
        }

它似乎我的nwidth也是图像宽度 - 所以它不工作..我有访问这些像素,我可以改变它们但我不知道为什么我可以数他们并找到黑色矩形的适当界限......如果有人能帮助我,我会真的感到满意,

1 个答案:

答案 0 :(得分:0)

这种图像分析存在一些问题:

1替换

if(p[0]==0 && p[1]==0 && p[2]==0)
{
    right = nWidth;//geting the position of the lastest black pixel;
}

if(p[0]==0 && p[1]==0 && p[2]==0)
{ 
    right = x; //geting the position of the lastest black pixel;
}  

您的x-iteration变量已计算您所在的像素。

2您提供的代码仅适用于32bpp像素格式。如果这是故意的,你应该检查你正在分析的位图是否是兼容的格式。

3对于大多数压缩的图像格式,在黑色的所有3个颜色通道上通常不会得到0,你应该做一个“少于黑暗”检查而不是零。