2022/06/28(火) [n年前の日記]
#1 [python][cg_tools] ディザリング処理をするプログラムをPythonに移植中その3
任意のパレットを指定してディザリングをかけるサンプルプログラム群を ―― C++ で書かれてるソレを Python で書き直しているところ。
_Arbitrary-palette positional dithering algorithm
アルゴリズム2の移植を始めたものの、Python版の生成画像が、C++版とかなり違う生成画像になってしまった。おそらく std::sort() のあたりの処理を正しく書けてない気がする…。
あらかじめパレットデータから作っておいた輝度の配列の値を元にして、result.colors という配列の中身をソートするのかなと思ったのだけど…。そもそも Python でそういう処理ってどう書くのだろう。
上のように書いてみたけど、めちゃくちゃな結果になる…。
色々試してみたところ、以下のような記述だと似た結果になった。
本当にこれで合ってるんだろうか? 自信無し。
_Arbitrary-palette positional dithering algorithm
アルゴリズム2の移植を始めたものの、Python版の生成画像が、C++版とかなり違う生成画像になってしまった。おそらく std::sort() のあたりの処理を正しく書けてない気がする…。
/* Luminance for each palette entry, to be initialized as soon as the program begins */
static unsigned luma[16];
bool PaletteCompareLuma(unsigned index1, unsigned index2)
{
return luma[index1] < luma[index2];
}
// ...
// Sort the colors according to luminance
std::sort(result.colors, result.colors + MixingPlan::n_colors, PaletteCompareLuma);
return result;
あらかじめパレットデータから作っておいた輝度の配列の値を元にして、result.colors という配列の中身をソートするのかなと思ったのだけど…。そもそも Python でそういう処理ってどう書くのだろう。
lst = []
for i in range(n_colors):
lst.append([r_colors[i], luma[i]])
nlst = sorted(lst, key=lambda x: x[1])
cols = [row[0] for row in nlst]
return cols
上のように書いてみたけど、めちゃくちゃな結果になる…。
色々試してみたところ、以下のような記述だと似た結果になった。
cols = sorted(r_colors, key=lambda x: luma[x])
return cols
本当にこれで合ってるんだろうか? 自信無し。
[ ツッコむ ]
以上、1 日分です。