ベイヤーフィルターを使用して作成された画像がありますが、色が少しずれています。正しい色を得るには、各ピクセルのRGとBに特定の係数(R、G、Bごとに異なる係数)を掛ける必要があります。私はPythonイメージングライブラリを使用しており、もちろんPythonで記述しています。これを効率的に行う方法はありますか?
ありがとう!
ベイヤーフィルターを使用して作成された画像がありますが、色が少しずれています。正しい色を得るには、各ピクセルのRGとBに特定の係数(R、G、Bごとに異なる係数)を掛ける必要があります。私はPythonイメージングライブラリを使用しており、もちろんPythonで記述しています。これを効率的に行う方法はありますか?
ありがとう!
これを行う方法は次のとおりです。
point
チャネルを係数で乗算するために使用します(1.5
例では、rチャネル上)。コードは次のとおりです。
import Image
im = Image.open('1_tree.jpg')
im = im.convert('RGB')
r, g, b = im.split()
r = r.point(lambda i: i * 1.5)
out = Image.merge('RGB', (r, g, b))
out.show()
オリジナル:
1.5
赤のチャネルに(少し赤みがかった..)を掛けたもの:
convert()
これは、次の関数を使用して単純な変換行列を使用するだけで、非常に効率的に実行できます。
#!/usr/bin/env python3
from PIL import Image
# Open image
im = Image.open('tree.jpg')
# Make transform matrix, to multiply R by 1.5, leaving G and B unchanged
Matrix = ( 1.5, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0)
# Apply transform and save
im = im.convert("RGB", Matrix)
im.save('result.png')
入力画像:
結果画像:
キーワード:Python、PIL、Pillow、カラーマトリックス、カラーマトリックス、変換、乗算チャネル、スケールチャネル、個別、個別、個別チャネル、バンド、コンポーネント、個別、分割チャネル、マージチャネル、画像、画像処理。
基本的な最適化として、入力値(0-255)を出力値(0-255)にマップするために、R、G、およびBにそれぞれ1つずつ、3つのルックアップテーブルを作成すると、少し時間が節約される場合があります。配列エントリの検索は、10進数値を乗算して結果を整数に丸めるよりも、おそらく高速です。どれだけ速いかわからない。
もちろん、これは値が常に同じようにマップされることを前提としています。
ドキュメントから:
from PIL import Image
Image.eval(image, function) => image
指定された画像の各ピクセルに関数(1つの引数を取る必要があります)を適用します。画像に複数のバンドがある場合、同じ機能が各バンドに適用されます。関数は可能なピクセル値ごとに1回評価されるため、ランダムコンポーネントやその他のジェネレーターを使用できないことに注意してください。
astynaxによって提案されているよう.split
に、画像を3つのチャネルごとに個別の画像に分割し、それらを元に戻すために使用できます。.eval
Image.merge
乗算係数のいずれかが1より大きい場合は、必ず出力を255にクランプしてください。
タイプがnumpy.ndarrayの場合、img = np.uint8(img * factor)