通常為了分辨圖像識別會進行"Binary Thresholding"。
其透過設立一門檻值(Threshold value),將像數值大於門檻值的像素點設為255,小於則設為0。
二值化並不一定要對整張影像進行處理,有時可將影像分成數個子區間,再針對各個子區間分別進行二值化。
影像二值化以灰階圖為例如下圖所示 :
C#
private static Bitmap binarization(Bitmap bitmap, int value)
{
int width = bitmap.Width;
int height = bitmap.Height;
System.IntPtr srcScan, dstScan;
BitmapData srcBmData, dstBmData;
Bitmap dstBitmap =ImageExtract.InitPonitMethod(bitmap, width, height, out srcScan, out dstScan, out srcBmData, out dstBmData);
unsafe //啟動不安全代碼
{
byte* srcP = (byte*)srcScan;
byte* dstP = (byte*)dstScan;
int srcOffset = srcBmData.Stride - width * 3;
int dstOffset = dstBmData.Stride - width * 3;
byte MAX = 255, MIN = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++, srcP += 3, dstP += 3)
{
*dstP = (srcP[0] > value) ? MAX : MIN;//blue
*(dstP + 1) = (srcP[1] > value) ? MAX : MIN;//green
*(dstP + 2) = (srcP[2] > value) ? MAX : MIN; //red
}
srcP += srcOffset;
dstP += dstOffset;
}
}
bitmap.UnlockBits(srcBmData);
dstBitmap.UnlockBits(dstBmData);
return dstBitmap;
}
完整程式碼 : https://github.com/Lung-Yu/ImageToolBox/blob/master/ImageProcessToolBox/Binarization.cs
文章標籤
全站熱搜
留言列表