午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

カラー画像を1bpp(1bit)白黒画像に変換アプリver1.1、閾値の自動設定、大津の二値化でできたかも

大津の二値化を使った白黒画像できたかも
今回のアプリのダウンロード先
 
1年前に作った
カラー画像を1bppの白黒2値化するアプリは
白黒の閾値は手動で設定か、画像全体の輝度平均で指定していたのを
 
イメージ 1
自動で設定する、自動1と自動2を付け足した
ついでに見た目も少し変更してver1.1
 
イメージ 2
元の画像
 
イメージ 3
8bppグレースケール
 
白黒2値化
イメージ 4
自動1
閾値は136になった
 
 
イメージ 5
自動2
閾値は168になった
結果はいまいちなんだけど
いちおう大津の二値化での閾値を真似たつもり
 
 
 
閾値の決定
画素(ピクセル)の輝度値が1~10までの10段階の場合で
それぞれの輝度値の画素個数が
1 3 1 1 5 3 1 0 0 1
だった場合で計算してみる

f:id:gogowaten:20191213141433p:plain

 
個数分並べてヒストグラムっぽくしてみる

f:id:gogowaten:20191213141444p:plain

イメージ 8
この中のどこを閾値にするのか
 
 
イメージ 9
見た感じだと4と5のところで分ければ良さそう
計算して求めるにはどうしたらいいのかってところ
参照したところ
判別分析法(大津の二値化) 画像処理ソリューション
http://imagingsolution.blog.fc2.com/blog-entry-113.html
 
 
【画像処理】大津の二値化処理の原理・特徴・計算式 | アルゴリズム雑記
https://algorithm.joho.info/image-processing/otsu-thresholding/
この辺を見ると、どうやら
ある閾値で分けたとき、それぞれの範囲の画素の割合と平均輝度で計算できるみたい
 
イメージ 10
しきいを1と2の間にしたときの
それぞれの範囲をa範囲、b範囲ってして
画素割合と平均輝度を計算
次は閾値を1増やして
 
イメージ 11
2と3の間にしたとき
これを9と10の間にするときまで全部計算
計算する値
 
a範囲をa、b範囲をb
aの画素割合= aの画素数 / 全画素数
bの画素割合= bの画素数 / 全画素数
aの平均輝度= aの輝度合計 / aの画素数
bの平均輝度= bの輝度合計 / bの画素数
ってして
X=aの画素割合*bの画素割合*(aの平均輝度ーbの平均輝度)^2
このXの値が一番大きくなったときの閾値
 
 
さっきのヒストグラムで計算すると

f:id:gogowaten:20191213141528p:plain

閾値1のときのXは0.876になった
 

f:id:gogowaten:20191213141544p:plain

閾値2のときは2.7552
全部計算して

f:id:gogowaten:20191213141553p:plain

閾値が4のときにXが最大の3.151になった
これであっているかわかんないけど、それっぽい閾値が選ばれた
 
 
 
PixelFormat.Gray8のBitmapsourceからヒストグラム作成
イメージ 15
ヒストグラムから指定範囲のピクセルの個数
イメージ 16
ヒストグラムから指定範囲の平均輝度値
イメージ 17
これらを使って
閾値の計算
イメージ 18
背景色が青の330~351行目がそれ
これでそれっぽい閾値が得られる、これがアプリの自動2で動作するところ
 
大津の二値化を理解するには分散が必要みたいだけど、結果を得るだけなら画素割合と平均輝度だけでいいってことなのかも
説明見てもさっぱりわからないんだよねえ、説明の最後にある結果だけを真似てみたっていうだけ
 
 
自動1
イメージ 19
これはab平均輝度の差が一番小さいときの閾値
なので2値化したあとの白と黒の画素数が同じくらいになるのかな?当たり障りのない平均的な分け方になる?
試したらうまくいく画像もあったので追加した
 
 
元の画像

f:id:gogowaten:20191213141621p:plain

黒背景に黒のR32
 
自動2

f:id:gogowaten:20191213141631p:plain

閾値は101になった
黒いところは黒になる、正しい
 
自動1

f:id:gogowaten:20191213141644p:plain

閾値は8になった結果
かなり暗いところも白に変換されて形が見えるようになった
 
 
元画像

f:id:gogowaten:20191213141659p:plain

同じく初代グランツーリスモから白のS13
 
自動2

f:id:gogowaten:20191213141710p:plain

閾値は95になった
 
自動1

f:id:gogowaten:20191213141719p:plain

閾値11になった
白い
 
平均輝度

f:id:gogowaten:20191213141729p:plain

閾値は58
これはこれくらいがいいかなあ
 
 
 
ギットハブ
 
関連記事
次のバージョンは1年3ヶ月後


1年前の2018/1/22
カラー画像を1bpp(1bit)白黒画像に変換して保存するアプリ作ってみた、しきい値は手動設定 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15335812.html