mieki256's diary



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 が必要。
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 ドットの画像を変換して動作確認してみた。

Script name--mp (multi process)Time
yodither1.pyoff07:41
yodither1.pyon02:11
yodither1tritone.pyoff02:36
yodither1tritone.pyon01:11
yodither3.pyoff00:39
yodither3.pyon00:53
yodither4.pyoff00:30
yodither4.pyon00: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.

以上、1 日分です。

過去ログ表示

Prev - 2022/07 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project