PR

UWP SoftwareBitmap 二値化

CSharp用のアイキャッチ UWP
スポンサーリンク

備忘録

今回は、調べた結果自力で解決です。

コードはこちら

var buffer = new byte[4 * softwareBitmap.PixelWidth * softwareBitmap.PixelHeight];
softwareBitmap.CopyToBuffer(buffer.AsBuffer());

//閾値計算 明るさの最大値から固定値割
var MaxBriteness = 0;
var threshold = 0;
var Division = 0.45; //この数値を0~1の間で動かすと閾値が変動する
foreach (var v in buffer)
{
    if (MaxBriteness < v)
        MaxBriteness = v;
}
threshold = (int)(MaxBriteness * Division);
//求めた閾値から二値化
for (int x = 0; x < buffer.Length; x++)
{
    if (buffer[x] < threshold)
        buffer[x] = 0;
    else
        buffer[x] = 255;
}

使用フォーマット BitmapPixelFormat.Gray8

ちなみにBufferからSoftwareBitmapに変換する場合は

IBuffer bufferI = buffer.AsBuffer();
var sampleBitmap = SoftwareBitmap.CreateCopyFromBuffer(bufferI, BitmapPixelFormat.Gray8, SoftBitMap.PixelWidth, SoftBitMap.PixelHeight);

難しい数学は苦手です

二値化について調べてみたんですけど、有名な大津の二値化とかあったんですけど数式が読めなくて断念しました。
そもそも目的がバーコードリーダーなので回りの明るさの変化に対応できればOKってことで簡単な二値化にしました。

コメント

タイトルとURLをコピーしました