2022/06/23(木) [n年前の日記]
#1 [prog][cg_tools] ディザリング処理をするサンプルプログラムをビルドした
任意のパレットを指定してディザリングをかけるサンプルプログラム群を、Windows10 x64 21H2 + MSYS2 や、Ubuntu Linux 20.04 LTS でビルドしてみた。
_Arbitrary-palette positional dithering algorithm
_Arbitrary-palette positional dithering algorithm
◎ ソースファイル群。 :
前述の解説ページからコピペして、C++のソースファイル(.cpp)として保存してみた。
_yliluoma_ordered_dither_1a.cpp
_yliluoma_ordered_dither_1ba.cpp
_yliluoma_ordered_dither_1bb.cpp
_yliluoma_ordered_dither_1c.cpp
_yliluoma_ordered_dither_1d.cpp
_yliluoma_ordered_dither_2a.cpp
_yliluoma_ordered_dither_2b.cpp
_yliluoma_ordered_dither_3a.cpp
_adobelike_pattern_dither.cpp
処理内容の簡単な説明は以下。
_yliluoma_ordered_dither_1a.cpp
_yliluoma_ordered_dither_1ba.cpp
_yliluoma_ordered_dither_1bb.cpp
_yliluoma_ordered_dither_1c.cpp
_yliluoma_ordered_dither_1d.cpp
_yliluoma_ordered_dither_2a.cpp
_yliluoma_ordered_dither_2b.cpp
_yliluoma_ordered_dither_3a.cpp
_adobelike_pattern_dither.cpp
処理内容の簡単な説明は以下。
- yliluoma_ordered_dither_1a.cpp : 2色の組み合わせを評価して妥当な2色を選んでディザをかける。
- yliluoma_ordered_dither_1ba.cpp : 異なり過ぎる2色の組み合わせは除外して処理する。
- yliluoma_ordered_dither_1bb.cpp : 2色の差を CCIR 601 で求める。
- yliluoma_ordered_dither_1c.cpp : ループで結果を求めず数式で求めて高速化。ただし品質は落ちる。
- yliluoma_ordered_dither_1d.cpp : 3色のディザリングで処理する。
- yliluoma_ordered_dither_2a.cpp : ディザは2色の組み合わせという前提を捨てて考えた版。
- yliluoma_ordered_dither_2b.cpp : 2a のガンマ値を補正した版。
- yliluoma_ordered_dither_3a.cpp : 2b のアレンジ版。
- adobelike_pattern_dither.cpp : Photoshopに近い処理。
◎ コンパイルする。 :
コンパイルには、g++、libgd が必要になる。できれば GNU Make も欲しい。
libgd は、MSYS2 も Ubuntu Linux 20.04 LTS もパッケージが用意されてるので、以下でインストールできる。
MSYS2の場合。
Ubuntu Linux 20.04 LTSの場合。
コンパイルの一例。
MSYS2の場合。
Ubuntu Linuxの場合。
ちなみに、「-fopenmp」を指定しなくても実行バイナリは作れるけれど、その場合、ディザをかける処理時間がかなり長くなって結構待たされる。「-fopenmp」を指定して実行バイナリを作ったら並列処理が有効になったようで、変換がかなり速くなった。
一応、Makefile も書いてみた。Makefile というファイル名にリネームして、*.cpp と同じ場所に置いておいて、make と打てば全ファイルをビルドできる。一応、make clean で、実行バイナリを削除できるようにもしておいた。
_Makefile.msys2
_Makefile.unix
$ g++ --version g++.exe (Rev2, Built by MSYS2 project) 12.1.0 ... $ make --version GNU Make 4.3 このプログラムは x86_64-pc-msys 用にビルドされました ...
libgd は、MSYS2 も Ubuntu Linux 20.04 LTS もパッケージが用意されてるので、以下でインストールできる。
MSYS2の場合。
pacman -S mingw-w64-x86_64-libgd or pacman -S mingw-w64-i686-libgd
Ubuntu Linux 20.04 LTSの場合。
sudo apt install libgd-dev
コンパイルの一例。
MSYS2の場合。
g++ yliluoma_ordered_dither_1a.cpp -fopenmp -o yliluoma_ordered_dither_1a.exe -lgd -lm
Ubuntu Linuxの場合。
g++ yliluoma_ordered_dither_1a.cpp -fopenmp -o yliluoma_ordered_dither_1a -lgd -lm
ちなみに、「-fopenmp」を指定しなくても実行バイナリは作れるけれど、その場合、ディザをかける処理時間がかなり長くなって結構待たされる。「-fopenmp」を指定して実行バイナリを作ったら並列処理が有効になったようで、変換がかなり速くなった。
一応、Makefile も書いてみた。Makefile というファイル名にリネームして、*.cpp と同じ場所に置いておいて、make と打てば全ファイルをビルドできる。一応、make clean で、実行バイナリを削除できるようにもしておいた。
_Makefile.msys2
_Makefile.unix
◎ ディザをかけてみる。 :
前述のページから、元画像をコピーしてきた。
_scene.png
各プログラムの使い方は以下。
一応、全部のプログラムに画像を生成させるシェルスクリプトも書いてみた。chmod +x test.sh で実行権限を与えてから ./test.sh で実行できる。
_test.sh
DOS窓上で動かす場合は以下のbatファイルが使えるけれど、MSYS2上でビルドした今回のプログラムをDOS窓上で動かすためには、*.dll群が必要になる。
_test.bat
一応、DOS窓上で動かせるようにするための .dll群を MSYS2 (/mingw64/bin/) からコピーしてくるシェルスクリプトも書いてみた。MSYS2上で、chmod +x copydll.sh で実行権限を与えて ./copydll.sh を実行すれば、動作に必要になるdll群がカレントディレクトリにコピーされる。シェルスクリプトの最初のあたりで、.dll が置かれてる場所を指定してるので、MSYS2 のインストール場所を変更してる場合は注意。
_copydll.sh
_scene.png
各プログラムの使い方は以下。
# MSYS2 ./xxxx.exe INPUT.png OUTPUT.png # Linux ./xxxx INPUT.png OUTPUT.png
一応、全部のプログラムに画像を生成させるシェルスクリプトも書いてみた。chmod +x test.sh で実行権限を与えてから ./test.sh で実行できる。
_test.sh
chmod +x test.sh ./test.sh
DOS窓上で動かす場合は以下のbatファイルが使えるけれど、MSYS2上でビルドした今回のプログラムをDOS窓上で動かすためには、*.dll群が必要になる。
_test.bat
一応、DOS窓上で動かせるようにするための .dll群を MSYS2 (/mingw64/bin/) からコピーしてくるシェルスクリプトも書いてみた。MSYS2上で、chmod +x copydll.sh で実行権限を与えて ./copydll.sh を実行すれば、動作に必要になるdll群がカレントディレクトリにコピーされる。シェルスクリプトの最初のあたりで、.dll が置かれてる場所を指定してるので、MSYS2 のインストール場所を変更してる場合は注意。
_copydll.sh
◎ Windows用実行バイナリ。 :
一応、MSYS2 (MinGW64) の .dll群も含めた実行バイナリその他を zip にして置いときます。
_yliluoma_ordered_dither.zip (14.6 MByte)
MSYS2 をインストールしてない環境で動くのかどうかは分からんけど…。一応サブPC(Windows10 64bit)でも動くことは確認しましたが…。
静的リンクしたかったのだけど、-static をつけてビルドしたら大量にエラーが出てしまって、しかし解決することができなくて。そのあたりは今後の課題。
_yliluoma_ordered_dither.zip (14.6 MByte)
MSYS2 をインストールしてない環境で動くのかどうかは分からんけど…。一応サブPC(Windows10 64bit)でも動くことは確認しましたが…。
静的リンクしたかったのだけど、-static をつけてビルドしたら大量にエラーが出てしまって、しかし解決することができなくて。そのあたりは今後の課題。
◎ 動作確認してみた感想。 :
出来上がった実行バイナリ群を使って、一応動作確認をして、前述のページに貼られている画像と比較してみたのだけど、見た感じ、結果が同じにはならなくて…。もしかすると、元画像が違うんじゃないかと邪推しているところ。
ただ、アルゴリズムに改良を加えると生成画像の品質が上がっていくことや、別のアルゴリズムを使えば生成画像の傾向が変わってくることはたしかに確認できた。
「とにかく処理が遅い」と説明されてたけど、たしかにこれはかなり時間がかかる処理だなと…。Photoshop の処理は全然速くて、かなり上手い具合にやってるらしいことも確認できた。
ただ、アルゴリズムに改良を加えると生成画像の品質が上がっていくことや、別のアルゴリズムを使えば生成画像の傾向が変わってくることはたしかに確認できた。
「とにかく処理が遅い」と説明されてたけど、たしかにこれはかなり時間がかかる処理だなと…。Photoshop の処理は全然速くて、かなり上手い具合にやってるらしいことも確認できた。
[ ツッコむ ]
以上です。