とある授業の課題でアルファブレンディングを画像の列方向の位置ごとに処理をかけていかなきゃいけなくなって色々試行錯誤していたのですが、とりあえず気づいたことをメモ。
- 列ごとへの画像への処理
これは普通にスライスで行けそうです。img[:, i]みたいな形でfor文回してやればなんとかなりそう
out = a1 + a2 * (1 - a1)
img_ab_chg.append((img_1[:,i] * a1 + img_2[:,i] * a2) / out)
わざわざリスト処理してるけど正直なところを言うとnumpyで完結させたかった感じはある。
- 列処理後の画像の転換
んで上の方法で列ごとに処理をしてやると画像が反転するのでもとにもどさないといけなくなるので、それを処理するためにnumpyのtranspose
を使用することに。画像の場合通常カラーで有ることがほとんどなので普通に.Tとかしてしまうと、(114,514,3)が(3,514,114)みたいになってしまう。そのために詳しく設定するtransposeを採用。
img_ab_chg = np.array(img_ab_chg).transpose(1,0,2)
順番を指定してやることで望んだ方向に転換してくれる寸法。本当はcv2のアフィン変換を使ったり様々な方法はあったけど、できるだけnumpyで簡潔したかったっていう個人的なプライドです。はい。
- matplotlibのplt.imshowについて
それとmatplotlibで出力する時、普通にnumpyのarrayを投げちゃうと色がとんでもないことに。調べてみるとどうやら画像を読み込んでplt.imshowするときには自動的に正規化する仕様らしい。コレに気づかずに何回コードを書き直したことか・・・・
なので手動で正規化することに。これで一応目標は達成。
本当はもっときれいに書きたいし、なるべくnumpyだけですべて処理したいけど他にも有るので一旦は次に進もうかと思います。
課題自体は3週間後だけど、できれば今週でなんとかしたい。でも明日は流石にゼミに向けて資料まとめなあかんな。いそがC。