[画像の色調を変える, 各色チャンネルごとにガンマ変換を使って], Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり
Python(パイソン) プログラム作ってみた インデックス へ
-----
2024.10.25 presented in [note] ( //note.com/runningWater/ )
----------
1 はじめに
これ以降に記述されている内容は、このようなコンピューター・プログラムを制作した、というような事を、ただ、述べているに過ぎない。
以下の記述を読んだ人が、それを単に参考にする、というのであれば、問題は無いと、思われる。
しかし、記述されている内容に沿って、その人が、そこに記されているのと同様の制作や作業を行った際に、その制作、作業、コンピューターの作動の結果、使用されたコンピューター等、様々な方面において、何らかの問題が発生しない、という保証は、全くない。
その制作、作業、コンピューターの作動の結果、その人や、その人が所属している組織、その人が使用した様々な機器、インフラストラクチャー等の、身の上にどのような事が起ころうとも、私は一切、責任を負わない。
このプログラムは、Python(パイソン) 言語を使って、記述されている。
----------
2 どのようなものを作ったのか
画像の明るさの感じを変えたい、という時に、しばしば、[ガンマ変換] ( [ガンマ補正] とも、呼ばれているようだ)というものを用いて、処理をすることがあるようだ。
それを、画像の各色チャンネル(青、緑、赤)に対して、適用してみたら、画像の色調を変えることが、できるかも、
と、いうことで、そのようなもの(以降、[モジュール群]と呼ぶ)を、作ってみた。
以下に、[モジュール群]の使用例を、記す。
-----
処理例1
青、緑、赤の、色チャンネルに対して、下記のように、ガンマ値を設定した(この詳細については、後述)。
( 青 2.0 , 緑 0.5 , 赤 0.5 )
その結果、下図のように、色調の変更が、行われた。
-----
処理例2
青、緑、赤の、色チャンネルに対して、下記のように、ガンマ値を設定した。
( 青 0.5 , 緑 2.0 , 赤 0.5 )
その結果、下図のように、色調の変更が、行われた。
-----
処理例3
青、緑、赤の、色チャンネルに対して、下記のように、ガンマ値を設定した。
( 青 0.5 , 緑 0.5 , 赤 2.0 )
その結果、下図のように、色調の変更が、行われた。
----------
3 変更前の画像データに対し、各色チャンネルごとに、[ガンマ変換]を施す
[ガンマ変換]という処理については、インターネット上の、様々なコンテンツにおいて、解説されていると思う。
その説明の中で、ガンマ値の設定についても、述べられていると、思う。この値の設定により、どのような色調変更が行われるかが、決まることになる。
本[モジュール群]においては、色チャンネルごとに、ガンマ値を設定できるようにしたのである。その結果、前章にみたような、画像の色調を変化させることが、できたのだ。
----------
4 [モジュール群]を構成するモジュール
下記のモジュールより、構成される。
[ VaryColorByGamma ]
[ TestVaryColorByGamma ]
これらのモジュールは、必要に応じて、下記に解説されているモジュールを、使用している。
[[画像処理, OpenCV2 使用] を 行う, 機能追加版, 多角形(内部ぬりつぶし)描画機能を追加] , Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり
Python(パイソン) ,ソースプログラムリスト あり ,プログラム作ってみた ,[エラー処理] を 行う
=============================
以降に、各モジュールの内容を、記す。
----------
5 [ VaryColorByGamma モジュール ]
ファイル名 [ VaryColorByGamma.py ]
----------
import ImageDataTwoDimensionHandlingV3
#===========================================
class VaryColorByGamma :
CV_CLASS_NAME = "VaryColorByGamma"
#------------------------------------------------------------
# definition of constructer
def __init__( self ) :
methode_name = "constructer"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
#[ 0 ] , ImageData Source
#[ 1 ] , ImageData Varied Color
self.iv_list_ImageDataTwoDimensionHandling = [ "" , "" ]
self.iv_width_of_ImageData_Source = 0
self.iv_height_of_ImageData_Source = 0
self.iv_list_value_after_gamma_correction_Blue = [ 0 ] * 256
self.iv_list_value_after_gamma_correction_Green = [ 0 ] * 256
self.iv_list_value_after_gamma_correction_Red = [ 0 ] * 256
self.iv_list_Gamma_value = [ 0.0 , 0.0 , 0.0 ]
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
return
#==============================================
def construct_ImageData ( self , arg_index ) :
methode_name = "construct_ImageData"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print ( "arg_index = " , arg_index )
print( "==================================" )
self.iv_list_ImageDataTwoDimensionHandling [ arg_index ] = \
ImageDataTwoDimensionHandlingV3 \
.ImageDataTwoDimensionHandlingV3 ( \
VaryColorByGamma.CV_CLASS_NAME
, methode_name
)
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
#--------------------------------------------
def load_ImageData ( self \
, arg_index
, arg_abs_path_of_ImageData
) :
methode_name = "load_ImageData"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print ( "arg_index = " , arg_index )
print ( "arg_abs_path_of_ImageData = "
, arg_abs_path_of_ImageData )
print( "==================================" )
self.iv_list_ImageDataTwoDimensionHandling [ arg_index ] \
.load_image_data ( \
VaryColorByGamma.CV_CLASS_NAME
, methode_name
, arg_abs_path_of_ImageData
)
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
#--------------------------------------------
def set_ImageData ( self \
, arg_index
, arg_ins_ImageDataTwoDimensionHandling
) :
methode_name = "set_ImageData"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print ( "arg_index = " , arg_index )
print( "==================================" )
self.iv_list_ImageDataTwoDimensionHandling [ arg_index ] \
= arg_ins_ImageDataTwoDimensionHandling
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
#--------------------------------------------
def get_ImageData ( self \
, arg_index
) :
methode_name = "get_ImageData"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print ( "arg_index = " , arg_index )
print( "==================================" )
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
return self.iv_list_ImageDataTwoDimensionHandling [ arg_index ]
#=============================================
def write_ImageData_Varied_Color ( self \
, arg_abs_path_of_output_file
) :
methode_name = "write_ImageData_Varied_Color"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
self.iv_list_ImageDataTwoDimensionHandling [ 1 ] \
.write_loaded_image_data_to_directed_path ( \
VaryColorByGamma.CV_CLASS_NAME
, methode_name
, arg_abs_path_of_output_file
)
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
#=============================================
def set_Gamma_values ( self \
, arg_list_Gamma_value
# [ 0 ] , Blue , [ 1 ] , Green , [ 2 ] , Red
) :
methode_name = "set_Gamma_values"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
self.iv_list_value_after_gamma_correction_Blue = [ 0 ] * 256
self.iv_list_value_after_gamma_correction_Green = [ 0 ] * 256
self.iv_list_value_after_gamma_correction_Red = [ 0 ] * 256
self.iv_list_Gamma_value [ 0 ] = \
arg_list_Gamma_value [ 0 ]
self.iv_list_Gamma_value [ 1 ] = \
arg_list_Gamma_value [ 1 ]
self.iv_list_Gamma_value [ 2 ] = \
arg_list_Gamma_value [ 2 ]
print( "==================================" )
print( "Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print ( "self.iv_list_Gamma_value = " , self.iv_list_Gamma_value )
print ( "==================================" )
#-----------------------------------------------------
for i in range ( 0 , 256 ) :
w1 = i / 255.0
#------------ Blue ------------------
w2 = 255 * \
pow ( \
w1
, ( 1.0 / self.iv_list_Gamma_value [ 0 ] )
)
self.iv_list_value_after_gamma_correction_Blue [ i ] = int ( w2 )
#------------ Green ------------------
w3 = 255 * \
pow ( \
w1
, ( 1.0 / self.iv_list_Gamma_value [ 1 ] )
)
self.iv_list_value_after_gamma_correction_Green [ i ] = int ( w3 )
#------------ Red -------------------
w4 = 255 * \
pow ( \
w1 \
, ( 1.0 / self.iv_list_Gamma_value [ 2 ] )
)
self.iv_list_value_after_gamma_correction_Red [ i ] = int ( w4 )
#---------------------------------------------------------------
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
#=============================================
def vary_color_of_ImageData_by_Gamma ( self ) :
methode_name = "vary_color_of_ImageData_by_Gamma"
print( "==================================" )
print( "Enter into , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
self.iv_width_of_ImageData_Source = \
self.iv_list_ImageDataTwoDimensionHandling [ 0 ] \
.get_width_of_ImageData ( )
self.iv_height_of_ImageData_Source = \
self.iv_list_ImageDataTwoDimensionHandling [ 0 ] \
.get_height_of_ImageData ( )
#-------------------------
for x in range ( 0 , ( self.iv_width_of_ImageData_Source - 1 ) ) :
for y in range ( 0 , ( self.iv_height_of_ImageData_Source - 1 ) ) :
list_varying_color \
= self.decide_varying_color_of_this_pixel ( x , y )
#vary color
self.iv_list_ImageDataTwoDimensionHandling [ 1 ] \
.put_data_of_one_pixel ( \
VaryColorByGamma.CV_CLASS_NAME # arg_requester_module
, methode_name # arg_requester_function
# in the commonly used mathematical XY cordinates
, x
, y
, list_varying_color [ 0 ] # arg_color_data_Blue
, list_varying_color [ 1 ] #arg_color_data_Green
, list_varying_color [ 2 ] #arg_color_data_Red
)
#-----------------------------------------------------------------------------
print( "==================================" )
print( "Exit from , Class = "
+ VaryColorByGamma.CV_CLASS_NAME
+ " , methode = " + methode_name )
print( "==================================" )
#=============================================
def decide_varying_color_of_this_pixel ( self , arg_x , arg_y ) :
methode_name = "decide_varying_color_of_this_pixel"
# print( "==================================" )
# print( "Enter into , Class = "
# + VaryColorByGamma.CV_CLASS_NAME
# + " , methode = " + methode_name )
# print( "==================================" )
list_color_of_directed_pixel = \
self.iv_list_ImageDataTwoDimensionHandling [ 0 ] \
.get_data_of_one_pixel ( \
VaryColorByGamma.CV_CLASS_NAME # arg_requester_module
, methode_name # arg_requester_function
# in the commonly used mathematical XY cordinates
, arg_x
, arg_y
)
#----------------------------------------
return_list = [ 0 , 0 , 0 ]
#Blue
w_0 = list_color_of_directed_pixel [ 0 ]
return_list [ 0 ] = self.iv_list_value_after_gamma_correction_Blue [ w_0 ]
#Green
w_1 = list_color_of_directed_pixel [ 1 ]
return_list [ 1 ] = self.iv_list_value_after_gamma_correction_Green [ w_1 ]
#Red
w_2 = list_color_of_directed_pixel [ 2 ]
return_list [ 2 ] = self.iv_list_value_after_gamma_correction_Red [ w_2 ]
return return_list
#=================================
----------
----------
6 [ TestVaryColorByGamma モジュール ]
ファイル名 [ TestVaryColorByGamma.py ]
----------
import VaryColorByGamma
#=====================================
# Test
#=====================================
module_name = "___"
function_name = "Test"
#***************************************
abs_path_of_CopySource_ImageData \
= "E:ForPython/ForTest/Test_G/Before_Varying.png"
#*******************************************
ins_VaryColorByGamma = \
VaryColorByGamma \
.VaryColorByGamma ( )
#---------------------------
ins_VaryColorByGamma \
.construct_ImageData ( 0 )
ins_VaryColorByGamma \
.load_ImageData ( 0 , "E:ForPython/ForTest/Test_G/Before_Varying.png" )
#---------------------------
ins_VaryColorByGamma \
.construct_ImageData ( 1 )
ins_VaryColorByGamma \
.load_ImageData ( 1 , "E:ForPython/ForTest/Test_G/Before_Varying.png" )
#---------------------------
#===== Test 1 ==============================
ins_VaryColorByGamma \
.set_Gamma_values ( [ 2.0 , 0.5 , 0.5 ] )
# Blue Green Red
ins_VaryColorByGamma \
. vary_color_of_ImageData_by_Gamma ( )
ins_VaryColorByGamma \
.write_ImageData_Varied_Color ( \
"E:ForPython/ForTest/Test_G/Output_1.png"
)
#===== Test 2 ==============================
ins_VaryColorByGamma \
.set_Gamma_values ( [ 0.5 , 2.0 , 0.5 ] )
# Blue Green Red
ins_VaryColorByGamma \
. vary_color_of_ImageData_by_Gamma ( )
ins_VaryColorByGamma \
.write_ImageData_Varied_Color ( \
"E:ForPython/ForTest/Test_G/Output_2.png"
)
#===== Test 3 ==============================
ins_VaryColorByGamma \
.set_Gamma_values ( [ 0.5 , 0.5 , 2.0 ] )
# Blue Green Red
ins_VaryColorByGamma \
. vary_color_of_ImageData_by_Gamma ( )
ins_VaryColorByGamma \
.write_ImageData_Varied_Color ( \
"E:ForPython/ForTest/Test_G/Output_3.png"
)
#-------------------------------------------------------------
----------
----------