简单地说,图像分割就是选定一个阈值,>=阈值的为 0,否则为 255 (255级灰度),分离结果是
二值化图像。
这样就将物体(Object)从背景(Background)里分出来了。
下面是实现最简单的图像分割的程序:
public Bitmap Split(Bitmap bm, byte flag)
{
Bitmap newBM = (Bitmap)bm.Clone();
BitmapData bmIn = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData bmOut = newBM.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* pIn = (byte*)(bmIn.Scan0.ToPointer());
byte* pOut = (byte*)(bmOut.Scan0.ToPointer());
for (int i = 0; i < bmIn.Height; i++)
{
for (int j = 0; j < bmIn.Width; j++)
{
if (pIn[0] > flag)
pOut[0] = pOut[1] = pOut[2] = 255;//这里只处理灰度图像
else
pOut[0] = pOut[1] = pOut[2] = 0;
pIn += 3;
pOut += 3;
}
pIn += bmIn.Stride - bmIn.Width * 3;
pOut += bmOut.Stride - bmOut.Width * 3;
}
}
bm.Dispose();
newBM.UnlockBits(bmOut);
return newBM;
}
代码这里就不作解释了,不明白的话就百度一下吧~
注:Stride表示的是扫描宽度,应该是bmp格式的需要(好像bmp格式要求图片的宽度是4的倍数),如果图像的宽度不是4的倍数的话,就填充,填充后的宽度就是Stride了,而width就是填充前的宽度。