通常為了分辨圖像識別會進行"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

arrow
arrow
    文章標籤
    Image Process Point processing
    全站熱搜

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()