忍者ブログ

たうのゲームブログ

ウディタ等で制作したゲームやツイッターに書ききれないことや備忘録など書き連ねていきます.

ウディタで二値化したい

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ウディタで二値化したい

したいか・・・?

はじめに


どうも,タイトルに納得がいかないたうです.
これまでずっと平均化フィルタ的なことをやってましたが,今回はウディタ上で二値化します.

なぜ急に二値化?って思われてるかもしれないですけど,自分でもそう思うくらい偶然できました.とりあえず結果を貼ってみたり.
画素値100で二値化 画素値160で二値化
カラー画像も二値化可能 RGB成分ごとに操作可能

▼動画で確認したい方はこちら▼

こんな具合で任意のしきい値で画像を二値化できるようになりました.
ドーナツ型のオブジェクトにグラデーションかければ,ゲームでよく見る円形のゲージとか作れるんじゃないでしょうか.

ということで詳細は続きからどうぞ.

詳細


冒頭でも書いたように,実は二値化処理は偶然できました.前回の加算型平均化フィルタ(積極的にこの名称は使っていこう)の改良を行った記事で,不透明度を下げすぎると一定値以下の画素が消えてしまう問題がありましたよね.具体的な値を出すと,不透明度1の時は127以下の画素値を持つ箇所は画素値0になっちゃう,的な.対策として不透明度の最低値を3~4程度にして,画像の表示枚数を増やすことで平均化っぽく見せつつ本来の色味をある程度保たせることができました.(それでも画素値30以下くらいの部分は切り捨てられちゃうんですけどね)

で,作ってる最中に思ったんです
「これって,逆に切り捨てる画素値任意で決められれば二値化できんじゃね?」
思っちゃったら作るしかない.ウディフェスゲーの制作をいったん放り投げて二値化にいそしみました.二値化にいそしむって言葉,今後一生使わないだろうな.

初めの壁は128以上の画素値をどのようにして切り捨てるのかでした.不透明度は整数の指定しかできませんし,1まで小さくしても画素値127までしか切り捨てられないんですもん.そんな問題を解決してくれたのは「カラー補正」君でした. この項目を弄ると,当然ですけど画像の色が変化します.変化の仕方も単純で,元の色味からの割合変化.RGB値を加算してるんじゃないんですよ~~ってことですね.だからここにも書かれているように,元の画像が真っ黒だったらいくら弄ろうと変わらないと.

もともと機能としてあったのは知ってて,これまでも何となく使ってきましたが,不透明度と一緒に増減させたら最終的に表示される画素値ってどうなるんだろう...って思ったのでいつも通り調査.
こんな感じで不透明度とカラーを弄って画素値見ました
あのとき同様,フリーの画像ビューア「IrfanView」を使って画素値を見ていきました.IrfanViewだいすき.地道にポチポチ見てっただけなので,最終的にわかったことを書くと...

表示画素値=元の画素値×(不透明度/255)×(カラー/100) 

おおむね上の式のような画素値の関係が成り立ってました.おおむねって書いたのはちょっとよくわからないところがあったから.それは最後に書きます.

元の話に戻ると,どうやらカラー補正と不透明度をつかえば128以上の画素値であっても切り捨てられそうです.表示画素値は四捨五入されるので,上記の計算の結果が0.5未満になるような不透明度とカラー値を,しきい値に応じて計算すればいいわけですね.計算すればいいだけ...とは書きましたが,不透明度とカラーの計算法の検討に一番時間もってかれました.ノートの上だったら理想的な不透明度とかカラーとか出すのは容易なんだけど,ウディタ上では整数っていう離散的な値を設定してあげなきゃいけなくて,不透明度によってはカラーを少し弄っただけで閾値がめっちゃとびとびになる!みたいなことが多発して...はげちゃうかと思った.基本的に不透明度が1の時は画素値1~127くらいまでのしきい値まで対応できて,それ以降は不透明度2,3...と挙げていく感じで処理をしています.

そうして出来上がったのが冒頭にお見せしたものというわけ.(二値化するために同じ画像を255枚重ねて,画素値が1以上の箇所を全部白飛びさせてます).使用例はあんまり思いつかないですけど,円ゲージとか,上に元の画像を重ねて画像の一部だけ強調したりとか...使おうと思えば使えそうじゃないですか?画像の強調はほかのソフト使ったほうがいいと思いますが.
円ゲージ 光当たってるとこだけ強くして木漏れ日...とか


まとめ



今回はウディタ上で二値化をしてみました.
二値化,というより画素値が一定以下の箇所のみ切り抜くといったほうが動作としては正しいですかね.黒背景でやったら二値化ですけど.加算表示をしているとはいえ255枚画像が重なっちゃってるので,案外背景には依存しない仕組みです.だから円ゲージとかは素のまま置いちゃってもいいのかもしれませんね.
いけました ちょっと透けてますけど
背景のマップ何とかならなかったのか.いつもの横着癖がでました.おいてあるソファは気の迷いで作ったマップチップです.それはそれとして,二値化するだけなら余裕ですね.カラーごとに分けて二値化する場合だけは背景少し注意かな

で,ちょっと疑問が残った個所があるんですけど,カラー値0の時って完全に消えるわけじゃないんですかね.最終的な画素値のあの計算式でカラーに0を入れると当然表示画素値って0になりますよね?
(不)115(カ)0 →(R,G,B)=(0,0,0) (不)135(カ)0 →(R,G,B)=(1,1,1)
なんかならないところあるんですよねぇ...
まぁ予想と反すること自体は何の問題もないんですけど,この不可解なところ以外は全部計算合っちゃってるのが怖い.元の画素値が141以上あると残るっぽいんですけど141ってひとよひとよに...じゃないですか多分...よくわからない現象が明確な理由をもって存在してるかもしれないの本当に怖い.シリアルキラーを見ているみたいだ.そもそもコンピュータビジョンとかそこら辺の知識は皆無に等しいので,その界隈の人から見たら当たり前の現象なのかもしれないですけど.知ってる人いたら教えてください.

とはいえ,カラー値を0にしなければそれ以外は何の問題もなかったので動作自体は問題ないはずです.何かあったら改良しましょう.ってな感じで今日は終わりです,ありがとうございました.


------------------------------------------------------------------------------------------------
◆お問い合わせはこちらまで◆
メール(tau.accs@gmail.com)
ツイッター(@Labyrith_Hyde
------------------------------------------------------------------------------------------------
PR

コメント

プロフィール

HN:
たう
性別:
男性
自己紹介:

ウディタ・Unity(勉強中)を使って
ゲーム作りしてます.主な進捗はTwitterに.
Twitterに書ききれない進捗や,
備忘録を不定期で記録していきます.
よろしくどうぞ.

◆お問い合わせはこちらまで◆
メール(tau.accs@gmail.com)
ツイッター(@Labyrith_Hyde

P R