[画像の色調を変える, 各色チャンネルごとにガンマ変換を使って], Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり

Python(パイソン) プログラム作ってみた インデックス へ

-----

2024.10.25 presented in [note] ( //note.com/runningWater/ )

----------
1 はじめに

これ以降に記述されている内容は、このようなコンピューター・プログラムを制作した、というような事を、ただ、述べているに過ぎない。

以下の記述を読んだ人が、それを単に参考にする、というのであれば、問題は無いと、思われる。

しかし、記述されている内容に沿って、その人が、そこに記されているのと同様の制作や作業を行った際に、その制作、作業、コンピューターの作動の結果、使用されたコンピューター等、様々な方面において、何らかの問題が発生しない、という保証は、全くない。

その制作、作業、コンピューターの作動の結果、その人や、その人が所属している組織、その人が使用した様々な機器、インフラストラクチャー等の、身の上にどのような事が起ころうとも、私は一切、責任を負わない。

このプログラムは、Python(パイソン) 言語を使って、記述されている。

----------
2 どのようなものを作ったのか

画像の明るさの感じを変えたい、という時に、しばしば、[ガンマ変換] ( [ガンマ補正] とも、呼ばれているようだ)というものを用いて、処理をすることがあるようだ。

それを、画像の各色チャンネル(青、緑、赤)に対して、適用してみたら、画像の色調を変えることが、できるかも、
と、いうことで、そのようなもの(以降、[モジュール群]と呼ぶ)を、作ってみた。

以下に、[モジュール群]の使用例を、記す。

-----
処理例1

青、緑、赤の、色チャンネルに対して、下記のように、ガンマ値を設定した(この詳細については、後述)。

( 青 2.0 , 緑 0.5 , 赤 0.5 )

その結果、下図のように、色調の変更が、行われた。

Fig 1

-----
処理例2

青、緑、赤の、色チャンネルに対して、下記のように、ガンマ値を設定した。

( 青 0.5 , 緑 2.0 , 赤 0.5 )

その結果、下図のように、色調の変更が、行われた。

Fig 2

-----
処理例3

青、緑、赤の、色チャンネルに対して、下記のように、ガンマ値を設定した。

( 青 0.5 , 緑 0.5 , 赤 2.0 )

その結果、下図のように、色調の変更が、行われた。

Fig 3

----------
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"
                                                                      )

#-------------------------------------------------------------

----------

----------

Python(パイソン) プログラム作ってみた インデックス へ

いいなと思ったら応援しよう!