「写真の円式補正アルゴリズム」の編集履歴(バックアップ)一覧に戻る

写真の円式補正アルゴリズム - (2010/06/18 (金) 11:25:56) のソース

製作者
-名前 堀江伸一
-アドバイザー Pixiv登録 えむかみさん このページのフィルタ作成時にこちらから感想を頼んでその時アドバイスをいただきました。



&ref(自分で作った画像処理ソフトの力はこの程度だったsono3.png)
ここでは、上記右写真を左イラストに変換するフィルタなどを掲載しております。



ページ一覧
[[2Dフィルタの限界について]]
[[写真の円式補正Pixiaでの実装]]
[[写真の円式補正Pixiaでの実装]]
[[写真の円式補正法C#での実装1]]リンク先はお勧めフィルタがあります。自動で写真を水彩画風味にしてくれます 但し画像処理をBitmap型で行っているため処理が重い
[[写真の円形補正法C#サンプルプログラム2]] 同様にお勧めフィルタ、同様に重い。Bitmap型をByte型にするとかなり軽くなります。


[[砂絵フィルタを作りたいんだけど]] 失敗作の砂絵フィルタ。ただしのっぺり部分の多い絵によっては上手く動きます。
[[その他の画像補正アルゴリズム]]その他製作予定のフィルタ
[[TVの砂嵐を再現するフィルタ]]
[[雲雲フィルター]]雲っぽいフィルターを作れそうで作れない現状です。


小さくてシンプルなフィルター
[[小さなフィルタのサンプル]]
[[小さなフィルタのサンプル2]]
[[小さなフィルタのサンプル3]]
[[小さなフィルタのサンプル4]]
[[小さなフィルタのサンプル5]]

[[虹色フィルタ]]
[[色使いまねフィルタ]]

[[プロの絵描きの線に自動で近づけてくれるソフト]]
リンク先はニューラルネット等にプロの絵描きや漫画家の描いた線画の線を学習させて作るフィルタ。
ベクター系イラストの曲線に適用される。

一言で言えば漫画家物まねフィルタ。
漫画家物まねフィルタを絵に適用すると、絵の中の曲線が修正され漫画家やプロの有名絵描きそっくりの絵になるフィルタ。
曲線の曲率のパターンを漫画家に似せることで漫画家風の絵になるフィルタ(予定のみ)。




このページではイラスト処理のアルゴリズムを掲載し、これをプログラムで実行するための手順を掲載する。
具体的には写真から下記のようなイラストの自動生成を目指す。
http://www.pixiv.net/member_illust.php?mode=medium&illust_id=9240145
どっかの特許やイラストソフトと処理が被っていたらご指摘ください。


[[C#で作った三角形ボタン]]

-写真からイラストを生成する
元になる写真をS、完成イラストをAとする。
SとAはRGB値をもったピクセル画像とする。

A=F(S)としFを解説する。





----
-基本手順(より手書きらしく見せるための追加手順については後で記述する)
-処理0 SとAを大きく升目で区切り、S、Aともに各ブロックを(i行,j列)と名づける。
-処理1 各ブロック(i,j)の升目内のピクセルの色を関数Kで調べK内での判断と出力をもとにAの同じ(i、j)ブロックに升目と同じくらいの大きさの円を描いていく。
-処理2 升目をより細かくし手順0と1を繰り返す。
-処理3 最後に元になった写真をAレイヤーの下層レイヤーとして薄めになるように設定して重ねる。(これはオプションとしてよい)





関数Kの中身について
-関数K案1
ブロックを一つ一つ処理していくときの手順。
あるブロック内の各ピクセルをRGB値をR^3(実数3つの組)で空間にマッピングし、この空間を升目で均等に区切っていく。
空間内の升目ごとのピクセル数を数え、一番色の数が多い升をAでの円形色塗りの基準色とし、Aにその基準色の円を描く。
RGB空間での各升目毎のピクセル数がバラけ過ぎてRGB空間の分散が大きいときは円を描かないこととする。
升目が小さくなるほど色塗りの基準を厳しくする。



-関数K案2
升目内でのRGB平均P(r、g、b)をとり、各ピクセルの点をPi(Ri,Gi,Bi)とする。
z=√(Σi=0...n(Ri-r)^2+(Gi-g)^2+(Bi-b)^2)/√m (mは升目内のピクセル数)
とし
c(z,m)   (mは升目内のピクセルの数)をzの大きさをチェックする関数とする。
関数cはzの値が大きすぎるならAに円を描かず、小さいならAにP色の円を透過処理で描いていく。
大きな円が小さな円で消えるのを防ぐため升目が小さくなるほど色塗りの基準を厳しくし、升目サイズに下限を設ける。
-オプション
上記処理は絵に空白が適度にできるのが処理の妙味である。
逆に升目に空白が多いのが気になる場合もあると思う。
Aを配列(a,b)(絵の縦横ピクセル数 a,b)と表現し、代入可能な値をA(i,j)=rgb(r,g,b) or emptyとし、全マスの初期値をempyt(値不定)とする。
最初Aにどんどん円を塗っていき、円を描いた部分のAにどんどんrgbの値を代入していく。
小さな円を描く段階で、描く範囲にemptyが多いなら自動で円を描くことで空白の隙間を小さくできる。
絵を描いた後はemptyを白色に置き換える。






-関数K案3 現在考え中












----
-追加機能
手書き感を出すための機能。
上記のままではイラストが機械的になってしまうので人間的なブレを演出する必要性がある。
ここではそれを記述する。

-ずれ。
Aに円を描く時、円の位置をずれさせると手書き間がでる。
これは円を描くときに円の位置をランダムにいじっても良いし、計算時の升目のサイズを小さくする前に、升目のサイズそのままに升目の区切り線をずらして計算する工程を追加しても良い。

-サイズ
円のサイズを多少ランダムにしたりするのも有効。
升目内のRGB値に重みをつけ、この重みから円のサイズを決定すると統一感が出ると思う。






-注意書き
このページは管理人の勉強もかねています。
どっかの特許やイラストソフトと処理が被っていたらご指摘ください。
#comment_num2(size=90,vsize=9,num=10,logpage=水玉風イラスト処理ソフト)








-製作過程
http://www.pixiv.net/member_illust.php?mode=medium&illust_id=9240145
のイラストを見て、どうやったらこういう絵が作れるのか興味を持ちリンク先で質問。
ペイジュンさんからの返答をいただいたものの、なぜかペイジュンさんがコメントを消してしまっているので、独り言のようになっている。
一応、怪しいレベルながらも画像の処理方法を思いついてしまったので、Pixivのメッセージ機能でペイジュンさんに2010年03月10日 15:05~2010年03月10日 15:23まで4回に分けて処理方法を送信。
その内容に加筆訂正を施してここに掲載した。