2022/07/13(水) [n年前の日記]
#1 [python] ディザリング処理をするPythonスクリプトに並列処理を追加してみた
任意のパレットを指定してディザリングをかけるサンプルプログラム群を ―― C++ で書かれてるソレを Python で書き直してみたわけだけど。
_Arbitrary-palette positional dithering algorithm
_Yliluoma's ordered dithering algorithm 1, 2, 3. Python version.
あまりに処理時間がかかり過ぎるので、並列処理(マルチプロセス)も使えるように修正してみた。
動作確認環境は、Windows10 x64 21H2 + Python 3.9.13 + Pillow 9.1.1 + tqdm 4.64.0。
ソースは以下。
_yodither1.py (Yliluoma's dithering algorithm 1, slow, not tri-tone)
_yodither1tritone.py (Yliluoma's dithering algorithm 1, tri-tone)
_yodither3.py (Yliluoma's dithering algorithm 3)
_yodither4.py (adobe like algorithm)
動作には、Pillow、tqdm が必要。
スクリプトの使い方は以下。
一応ヘルプも載せておきます。
コマンドラインオプションに --mp をつければ並列処理(マルチプロセス)が有効になる。
_Arbitrary-palette positional dithering algorithm
_Yliluoma's ordered dithering algorithm 1, 2, 3. Python version.
あまりに処理時間がかかり過ぎるので、並列処理(マルチプロセス)も使えるように修正してみた。
動作確認環境は、Windows10 x64 21H2 + Python 3.9.13 + Pillow 9.1.1 + tqdm 4.64.0。
ソースは以下。
_yodither1.py (Yliluoma's dithering algorithm 1, slow, not tri-tone)
_yodither1tritone.py (Yliluoma's dithering algorithm 1, tri-tone)
_yodither3.py (Yliluoma's dithering algorithm 3)
_yodither4.py (adobe like algorithm)
動作には、Pillow、tqdm が必要。
pip install Pillow -U pip install tqdm -U
スクリプトの使い方は以下。
python yodither1.py -i input.png -o out.png --mp python yodither1tritone.py -i input.png -o out.png --mp python yodither3.py -i input.png -o out.png --mp python yodither4.py -i input.png -o out.png --mp
一応ヘルプも載せておきます。
> py yodither1.py --help usage: yodither1.py [-h] -i INPUT -o OUTPUT [-p PALETTE] [-d DITHER] [--mp] Yliluoma ordered dithering 1 optional arguments: -h, --help show this help message and exit -i INPUT, --input INPUT Input png filename -o OUTPUT, --output OUTPUT Output png filename -p PALETTE, --palette PALETTE Palette file (.png or .gpl) -d DITHER, --dither DITHER Dither type 2,4,8 (2x2,4x4,8x8). default: 8 --mp Enable multi process
コマンドラインオプションに --mp をつければ並列処理(マルチプロセス)が有効になる。
◎ 処理時間を実測。 :
CPU : AMD Ryzen 5 5600X (6コア12スレッド、3.7 - 4.6GHz) 上で、289 x 176 ドットの画像を変換して動作確認してみた。
ということで、並列処理にすることで速くなる場合と、遅くなる場合があると分かった。でもまあ、8分近くかかってた処理が2分で終わるようになった点はありがたい。
1ドット単位の計算をする際に並列処理を使ってしまったので、すぐに結果が得られるアルゴリズムの場合は、並列処理をするための下準備のほうがネックになってしまったのだろうけど。これがもし、1ラインずつ処理する形で並列処理を使っていたら、どのスクリプトでも効果が得られたのではないか、という気もする。
ただ、どのみち Python では、この手の処理は遅すぎてアレだなと…。
Script name | --mp (multi process) | Time |
---|---|---|
yodither1.py | off | 07:41 |
yodither1.py | on | 02:11 |
yodither1tritone.py | off | 02:36 |
yodither1tritone.py | on | 01:11 |
yodither3.py | off | 00:39 |
yodither3.py | on | 00:53 |
yodither4.py | off | 00:30 |
yodither4.py | on | 00:49 |
- yodither1.py, yodither1tritone.py は並列処理にすることで速くなった。
- yodither3.py, yodither4.py は並列処理にしたらむしろ遅くなった。
ということで、並列処理にすることで速くなる場合と、遅くなる場合があると分かった。でもまあ、8分近くかかってた処理が2分で終わるようになった点はありがたい。
1ドット単位の計算をする際に並列処理を使ってしまったので、すぐに結果が得られるアルゴリズムの場合は、並列処理をするための下準備のほうがネックになってしまったのだろうけど。これがもし、1ラインずつ処理する形で並列処理を使っていたら、どのスクリプトでも効果が得られたのではないか、という気もする。
ただ、どのみち Python では、この手の処理は遅すぎてアレだなと…。
◎ 余談。 :
以前作成したスクリプトと生成画像が違ってしまって悩んでいたのだけど、以前作成したスクリプト内で、r2, g2, b2 と書くべきところを r2, b2, g2 と書いてしまっていたのが原因だった。以前のスクリプトの生成画像のほうが間違っていた…。
一応、修正して、Gist にアップロードし直しておいた。
_Yliluoma's ordered dithering algorithm 1, 2, 3. Python version.
一応、修正して、Gist にアップロードし直しておいた。
_Yliluoma's ordered dithering algorithm 1, 2, 3. Python version.
[ ツッコむ ]
以上、1 日分です。