備忘録
今回は、調べた結果自力で解決です。
コードはこちら
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ってことで簡単な二値化にしました。
コメント