2022/06/29(水) [n年前の日記]
#1 [python][cg_tools] ディザリング処理をするプログラムをPythonに移植中その4
任意のパレットを指定してディザリングをかけるサンプルプログラム群を ―― C++ で書かれてるソレを Python で書き直しているところ。
_Arbitrary-palette positional dithering algorithm
アルゴリズム2の移植中。アルゴリズム2は、CCIR601 とは別に CIEDE2000 を使った処理も記述されているけれど、試しに CIEDE2000 に切り替えたら真っ白な画像になってしまった…。
元々のC++版もコンパイルし直して画像を生成してみたけど、そちらはそれらしい結果が出てきた。Pythonで書き直す時にエンバグしてしまったのだな…。
それはさておき。元々のC++版で気になる部分を見つけた。以下の数式なのだけど…。
Pythonで書き直したら上記の場所でエラーが出た。平方根を求める関数 sqrt() にマイナス値が入ってしまう場合があって、「そんな値を渡されても計算できないよ」と怒られる。C++の場合は、sqrt() にマイナス値が入った時の動作は規定されてなくて、処理系(?)次第で動作が違うのだとか。
なんとなくだけど、本当は以下だったりしないのかなと…。これなら必ず正の値になるし。
_Arbitrary-palette positional dithering algorithm
アルゴリズム2の移植中。アルゴリズム2は、CCIR601 とは別に CIEDE2000 を使った処理も記述されているけれど、試しに CIEDE2000 に切り替えたら真っ白な画像になってしまった…。
元々のC++版もコンパイルし直して画像を生成してみたけど、そちらはそれらしい結果が出てきた。Pythonで書き直す時にエンバグしてしまったのだな…。
それはさておき。元々のC++版で気になる部分を見つけた。以下の数式なのだけど…。
C = sqrt(a * a + b + b);
Pythonで書き直したら上記の場所でエラーが出た。平方根を求める関数 sqrt() にマイナス値が入ってしまう場合があって、「そんな値を渡されても計算できないよ」と怒られる。C++の場合は、sqrt() にマイナス値が入った時の動作は規定されてなくて、処理系(?)次第で動作が違うのだとか。
なんとなくだけど、本当は以下だったりしないのかなと…。これなら必ず正の値になるし。
C = sqrt(a * a + b * b);
[ ツッコむ ]
以上です。