[画像を、別の画像に、重ね塗りする・機能強化 版] , Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり

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

-----

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

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

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

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

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

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

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

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

下記で説明した、モジュールに対して、機能強化を行ったようなものを、作ってみた。

[画像を、別の画像に、重ね塗りする] , Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり

以下、使用例で、説明する。

以下に説明するプログラムを使って、

下記の、 [Fig 1] の画像、 [Fig 2] の画像、[Fig 3]の画像より、下記の、 [Fig 4]の画像、[Fig 5]の画像が、作成された。

Fig 1


Fig 2


Fig 3


Fig 4


Fig 5


[Fig 4]画像は、[Fig 1] 画像を、[Fig 3] 画像の上に、回転した後に、重ね塗りしたような内容になっている。

[Fig 5]画像は、
 [Fig 2]画像中のオレンジ色に塗られている部分
 に対応する、[Fig 1] 画像の部分のみを、
 [Fig 3] 画像の上に、回転しないで、重ね塗りしたような内容になっている。

上記の説明中、
 「回転」に関しては、後述の、[do_rotation]パラメーター に関する説明の中で、述べる。
 「オレンジに塗られている部分に対応する」、に関しては、後述の、[use_or_not_PatternImageData]パラメーター に関する説明の中で、述べる。

以降、下記のような用語を用いる。

 [コピー元・画像]  [Fig 1] に示されている画像
 [コピーパターン・画像]  [Fig 2] に示されている画像
 [挿入される側・ソース画像]  [Fig 3] に示されている画像
 [挿入される側・生成画像]   [Fig 4] 、 [Fig 5] に示されている画像
 
この処理においては、以下のようなパラメーターを、調整できるようになっている。

-----

use_or_not_PatternImageData
 [コピーパターン・画像]を使用して、コピーする範囲を限定するか、否か
directed_x_and_y_on_PatternImageData
 [コピーパターン・画像]中の、指定位置
   use_or_not_PatternImageData = "Y" と、指定した場合には、
   [コピーパターン・画像]中の、ここに指定されている、xy座標の位置にあるピクセルの色と、
   同じ色を持つ、 [コピーパターン・画像]中の部分の範囲内に、
  [コピー元・画像]から、[挿入される側・生成画像]への、コピー対象となる範囲が、限定される
 
color_copying
 [コピー元・画像]中のピクセルのうち、ここで指定された色の範囲を持つものだけが、コピー対象となる
CopySource_From_and_To_xy
 [コピー元・画像]中のピクセルのうち、ここで指定された位置(XY座標)の範囲を持つものだけが、コピー対象となる
scale_rate_CopySource_to_InsertedSide
 [コピー元・画像] から [挿入される側・生成画像] への出力の際の、縮尺を、指定する
color_rate_CopySource_to_InsertedSide
 [コピー元・画像] から [挿入される側・生成画像] への出力の際の、
   [コピー元・画像] と [挿入される側・ソース画像] との(色の)混合比率を、指定する

下記3項目については、次章で、説明を行う   
 BasicLocation_x_and_y_on_CopySource_ImageData
 BasicLocation_x_and_y_on_Pattern_ImageData
 BasicLocation_x_and_y_on_InsertedSide_ImageData
   
do_rotation
 [コピー元・画像] から、[挿入される側・生成画像]へ、コピーする際に、回転を行った後のイメージを、コピーするか、否か
rotation_degree_of_inserting_on_InsertedSide_Source
 do_rotation = "Y" と、指定した場合には、ここで指定された角度分だけ、回転した後に、コピーする

----------

このプログラムは、適宜、下記で説明されているモジュールを、使用している。

[[画像処理, OpenCV2 使用] を 行う, 機能追加版, 多角形(内部ぬりつぶし)描画機能を追加] , Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり

Python(パイソン) ,ソースプログラムリスト あり ,プログラム作ってみた ,[エラー処理] を 行う

----------
3 画像の位置あわせ

[コピー元・画像]、 [コピーパターン・画像]、[挿入される側・ソース画像] を、どのような位置関係にセットしておくのか、という事を、指定できるようにした。そのために使用されるのが、下記パラメーター([画像上の基本位置])である。

 BasicLocation_x_and_y_on_CopySource_ImageData
  [コピー元・画像] 用の [画像上の基本位置]
 BasicLocation_x_and_y_on_Pattern_ImageData
  [コピーパターン・画像] 用の [画像上の基本位置]
 BasicLocation_x_and_y_on_InsertedSide_ImageData
  [挿入される側・ソース画像] 用の [画像上の基本位置]

例えば、上記の3つの[画像上の基本位置]が、下図中の赤色の点の位置を指していると、しよう。
画像は、上から順に、[コピー元・画像]、 [コピーパターン・画像]、[挿入される側・ソース画像] 、[挿入される側・生成画像] を、示している。

コピーが行われる際には、
各画像は、下図・右側に表したように、位置合わせが、行われ、
その後、[挿入される側・生成画像]への、コピーが、行われる。

Fig 6

----------
4 構成

このモジュール群は、以下のモジュールから、構成されている。

 [ CopyAndInsertImageDataV3 ]
 [ TestCopyAndInsertImageDataV3 ]

以降に、これらのモジュールの内容を、記す。

----------
5 [ CopyAndInsertImageDataV3 ]

ファイル名 [ CopyAndInsertImageDataV3.py ]

----------


import  math
import  time

import  ImageDataTwoDimensionHandlingV3

#===========================================
class  CopyAndInsertImageDataV3  :

    CV_CLASS_NAME = "CopyAndInsertImageDataV3"

    #------------------------------------------------------------
        # definition of constructer

    def __init__( self  ):

        methode_name = "constructer"

        print( "==================================" )
        print( "Enter into , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print( "==================================" )

                                      #[ 0 ] , ImageData CopySource
                                      #[ 1 ] , ImageData CopySource PatternImageData
                                      #[ 2 ] , ImageData InsertedSide_Source
                                      #[ 3 ] , ImageData InsertedSide_Generated
        self.iv_list_ImageDataTwoDimensionHandling = [ "" , "" , "" , "" ]

        self.iv_width_of_ImageData_InsertedSide_Generated = 0
        self.iv_height_of_ImageData_InsertedSide_Generated = 0

        self.iv_width_of_ImageData_Pattern =  0
        self.iv_height_of_ImageData_Pattern =  0

        print( "==================================" )
        print( "Exit from , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print( "==================================" )

        return

#==============================================
    def  construct_ImageData ( self   ,  arg_index  )  :

        methode_name = "construct_ImageData"

        print( "==================================" )
        print( "Enter into , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print ( "arg_index = " , arg_index )
        print( "==================================" )

        self.iv_list_ImageDataTwoDimensionHandling [ arg_index ] = \
              ImageDataTwoDimensionHandlingV3   \
                  .ImageDataTwoDimensionHandlingV3 ( \
                         CopyAndInsertImageDataV3.CV_CLASS_NAME
                       , methode_name
                                                                     )

        print( "==================================" )
        print( "Exit from , Class = "
                   + CopyAndInsertImageDataV3.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 = "
                   + CopyAndInsertImageDataV3.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 ( \
                      CopyAndInsertImageDataV3.CV_CLASS_NAME
                    , methode_name
                    , arg_abs_path_of_ImageData
                                         )

        print( "==================================" )
        print( "Exit from , Class = "
                   + CopyAndInsertImageDataV3.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 = "
                   + CopyAndInsertImageDataV3.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 = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print( "==================================" )

#--------------------------------------------
    def  get_ImageData ( self  \
                        ,   arg_index
                                   )  :

        methode_name = "get_ImageData"

        print( "==================================" )
        print( "Enter into , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print ( "arg_index = " , arg_index )
        print( "==================================" )

        print( "==================================" )
        print( "Exit from , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print( "==================================" )

        return  self.iv_list_ImageDataTwoDimensionHandling [ arg_index ]

#=============================================
    def  write_InsertedSide_Generated_ImageData ( self  \
                        ,   arg_abs_path_of_InsertedSide_Generated_ImageData
                                                                          )  :

        methode_name = "write_InsertedSide_Generated_ImageData"

        print( "==================================" )
        print( "Enter into , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print( "==================================" )

        self.iv_list_ImageDataTwoDimensionHandling [ 3 ]  \
              .write_loaded_image_data_to_directed_path ( \
                         CopyAndInsertImageDataV3.CV_CLASS_NAME
                       , methode_name
                       , arg_abs_path_of_InsertedSide_Generated_ImageData
                                                                                )

        print( "==================================" )
        print( "Exit from , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print( "==================================" )

#=================================
    def  copy_and_insert_ImageData (   self   \
                         ,  arg_use_or_not_PatternImageData
                         ,  arg_list_directed_x_and_y_on_PatternImageData

                         ,  arg_list_color_copying
                         ,  arg_list_CopySource_From_and_To_xy
                         ,  arg_scale_rate_CopySource_to_InsertedSide
                         ,  arg_color_rate_CopySource_to_InsertedSide

                         ,  arg_list_BasicLocation_x_and_y_on_CopySource_ImageData
                         ,  arg_list_BasicLocation_x_and_y_on_Pattern_ImageData
                         ,  arg_list_BasicLocation_x_and_y_on_InsertedSide_ImageData

                         ,  arg_do_rotation
                         ,  arg_rotation_degree_of_inserting_on_InsertedSide_Source
                                                      )  :

        methode_name = "copy_and_insert_ImageData"

        print( "==================================" )
        print( "Enter into , Class = "
                   + CopyAndInsertImageDataV3.CV_CLASS_NAME
                      + " , methode = " + methode_name )
        print ( "arg_use_or_not_PatternImageData = "  \
                           , arg_use_or_not_PatternImageData )
        print ( "arg_list_directed_x_and_y_on_PatternImageData = "  \
                           , arg_list_directed_x_and_y_on_PatternImageData )
        print ( "arg_list_color_copying = "  \
                           , arg_list_color_copying )
        print( "==================================" )

                        #---------------------
        list_color_of_pixel_directed_x_and_y_on_PatternImageData = [ 0 , 0  , 0 ]

        if (  arg_use_or_not_PatternImageData == "Y" ) :
                             #use PatternImageData
            self.iv_width_of_ImageData_Pattern =  \
                   self.iv_list_ImageDataTwoDimensionHandling [ 1 ]   \
                           .get_width_of_ImageData (  )
            self.iv_height_of_ImageData_Pattern =  \
                   self.iv_list_ImageDataTwoDimensionHandling [ 1 ]   \
                           .get_height_of_ImageData (  )
                    #-------------------------------
            list_color_of_pixel_directed_x_and_y_on_PatternImageData =   \
                   self.iv_list_ImageDataTwoDimensionHandling [ 1 ]   \
                          .get_data_of_one_pixel ( \
                                  CopyAndInsertImageDataV3.CV_CLASS_NAME
                               ,  methode_name
                                      # in the commonly used mathematical XY cordinates
                               ,  arg_list_directed_x_and_y_on_PatternImageData [ 0 ]
                               ,  arg_list_directed_x_and_y_on_PatternImageData [ 1 ]
                                                             )

            print ( "==================================" )
            print ( " Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
                          + " , methode = " + methode_name )
            print ( "list_color_of_pixel_directed_x_and_y_on_PatternImageData = " \
                        , list_color_of_pixel_directed_x_and_y_on_PatternImageData )
            print ( "==================================" )

            # time.sleep ( 5 )
            #-----------------------------------------
        from_x = arg_list_CopySource_From_and_To_xy [ 0 ] [ 0 ]
        to_x =   arg_list_CopySource_From_and_To_xy [ 1 ] [ 0 ]
        from_y = arg_list_CopySource_From_and_To_xy [ 0 ] [ 1 ]
        to_y = arg_list_CopySource_From_and_To_xy [ 1 ] [ 1 ]
       #-------------------------------------------------
        list_rotation_cos_and_sin = [ 0.0 , 0.0 ]
        if ( arg_do_rotation == "Y" ) :
            radian_rotation = arg_rotation_degree_of_inserting_on_InsertedSide_Source  \
                                         * ( math.pi / 180.0 )
            list_rotation_cos_and_sin [ 0 ]  = math.cos ( radian_rotation )
            list_rotation_cos_and_sin [ 1 ]  = math.sin ( radian_rotation )
       #---------------------------------------------------
        self.iv_width_of_ImageData_InsertedSide_Generated =   \
               self.iv_list_ImageDataTwoDimensionHandling [ 3 ]  \
                         .get_width_of_ImageData ( )
        self.iv_height_of_ImageData_InsertedSide_Generated =   \
               self.iv_list_ImageDataTwoDimensionHandling [ 3 ]  \
                         .get_height_of_ImageData ( )
       #-------------------------------------------------
        x = from_x
        while ( x <=  to_x  ) :

            # print ( "==================================" )
            # print ( " Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
            #               + " , methode = " + methode_name )
            # print ( "x = " , x )
            # print ( "==================================" )

            y = from_y
            while ( y <=  to_y  ) :

                self.process_for_one_location_x_y ( \
                       arg_use_or_not_PatternImageData

                     ,  x
                     ,  y

                     ,  list_color_of_pixel_directed_x_and_y_on_PatternImageData

                     ,  arg_list_color_copying
                     ,  arg_scale_rate_CopySource_to_InsertedSide
                     ,  arg_color_rate_CopySource_to_InsertedSide

                     ,  arg_list_BasicLocation_x_and_y_on_CopySource_ImageData
                     ,  arg_list_BasicLocation_x_and_y_on_Pattern_ImageData
                     ,  arg_list_BasicLocation_x_and_y_on_InsertedSide_ImageData

                     ,  arg_do_rotation
                     ,  list_rotation_cos_and_sin
                                                               )
            #-----------------------------
                y += 1
       #-----------------------------
            x += 1
    #-------------------------------------

        print ( "==================================" )
        print ( "Exit from Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
                          + " , methode = " + methode_name )
        print ( "==================================" )

#=================================
    def  process_for_one_location_x_y (   self  \
                      ,  arg_use_or_not_PatternImageData

                      ,  arg_x
                      ,  arg_y

                      ,  arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData

                      ,  arg_list_color_copying
                      ,  arg_scale_rate_CopySource_to_InsertedSide
                      ,  arg_color_rate_CopySource_to_InsertedSide

                      ,  arg_list_BasicLocation_x_and_y_on_CopySource_ImageData
                      ,  arg_list_BasicLocation_x_and_y_on_Pattern_ImageData
                      ,  arg_list_BasicLocation_x_and_y_on_InsertedSide_ImageData

                      ,  arg_do_rotation
                      ,  list_rotation_cos_and_sin
                                                      )  :

        methode_name = "process_for_one_location_x_y"

       # print ( "==================================" )
       # print ( "Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
       #                   + " , methode = " + methode_name )
       # print ( "arg_x = " , arg_x )
       # print ( "arg_y = " , arg_y )
       # print ( "==================================" )

       #********************************
        list_vector_from_BasicLocation_CopySource_to_arg_x_and_y = [    \
            ( arg_x -                                                  \
                arg_list_BasicLocation_x_and_y_on_CopySource_ImageData [ 0 ] ) \
            ,                                                                  \
            ( arg_y -                                                          \
                arg_list_BasicLocation_x_and_y_on_CopySource_ImageData [ 1 ] )  \
                                                                                                     ]
                #----------------------------------------
        get_location_from_CopySource_x = arg_x
        get_location_from_CopySource_y = arg_y
                #---------------------------------------
        w_x_after_applying_scale_rate =       \
                 list_vector_from_BasicLocation_CopySource_to_arg_x_and_y [ 0 ]  \
                       * arg_scale_rate_CopySource_to_InsertedSide
        w_y_after_applying_scale_rate =       \
                 list_vector_from_BasicLocation_CopySource_to_arg_x_and_y [ 1 ]  \
                       * arg_scale_rate_CopySource_to_InsertedSide
                 #----------------------------
        list_vector_from_BasicLocation_InsertedSide_to_put_location_on_InsertedSide \
                  = [ 0.0  ,  0.0  ]
                #-------------------
        if ( arg_do_rotation == "Y" ) :
            w_rotated_x =    \
                ( list_rotation_cos_and_sin [ 0 ] * w_x_after_applying_scale_rate )  \
                 -                                         \
                 ( list_rotation_cos_and_sin [ 1 ] * w_y_after_applying_scale_rate )
            w_rotated_y =    \
                ( list_rotation_cos_and_sin [ 1 ] * w_x_after_applying_scale_rate )  \
                 +                                         \
                 ( list_rotation_cos_and_sin [ 0 ] * w_y_after_applying_scale_rate )
               #---------------------
            list_vector_from_BasicLocation_InsertedSide_to_put_location_on_InsertedSide [ 0 ] \
                    = w_rotated_x
            list_vector_from_BasicLocation_InsertedSide_to_put_location_on_InsertedSide [ 1 ] \
                    = w_rotated_y
        else :
            list_vector_from_BasicLocation_InsertedSide_to_put_location_on_InsertedSide [ 0 ] \
                    = w_x_after_applying_scale_rate
            list_vector_from_BasicLocation_InsertedSide_to_put_location_on_InsertedSide [ 1 ] \
                    = w_y_after_applying_scale_rate
        #-------------------------------------------
        put_location_x =                \
            int ( arg_list_BasicLocation_x_and_y_on_InsertedSide_ImageData [ 0 ]  \
                + list_vector_from_BasicLocation_InsertedSide_to_put_location_on_InsertedSide [ 0 ] \
                  )
        put_location_y =                \
            int ( arg_list_BasicLocation_x_and_y_on_InsertedSide_ImageData [ 1 ]  \
                + list_vector_from_BasicLocation_InsertedSide_to_put_location_on_InsertedSide [ 1 ]  \
                  )
        if (  (  put_location_x < 0 )                 \
            or                                                \
              (  put_location_x >=                  \
                    self.iv_width_of_ImageData_InsertedSide_Generated )    \
            or                                               \
               (  put_location_y < 0 )                 \
            or                                                \
               (  put_location_y >=        \
                       self.iv_height_of_ImageData_InsertedSide_Generated )     \
           ) :
                         # area over --> not draw, no error message
            return "N"
                 #--------------------------------------
        list_color_data_for_put = \
                self.decide_color_for_put (    \
                         arg_use_or_not_PatternImageData
                      ,  arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData

                      ,  arg_list_color_copying
                      ,  arg_color_rate_CopySource_to_InsertedSide

                      ,  get_location_from_CopySource_x
                      ,  get_location_from_CopySource_y
                      
                      ,  list_vector_from_BasicLocation_CopySource_to_arg_x_and_y
                      
                      ,  arg_list_BasicLocation_x_and_y_on_Pattern_ImageData

                      ,  put_location_x
                      ,  put_location_y
                                                    )

        if (  list_color_data_for_put [ 0 ] == "N" ) :
                   # on this location, not draw color exist
                   # so, this location must not be draw
            return "N"
      #------------------------------------
        self.iv_list_ImageDataTwoDimensionHandling [ 3 ]   \
               .put_data_of_one_pixel ( \
                            CopyAndInsertImageDataV3.CV_CLASS_NAME
                         ,  methode_name
                              # in the commonly used mathematical XY cordinates
                         ,  put_location_x
                         ,  put_location_y

                         ,  list_color_data_for_put [ 1 ]   # arg_color_data_Blue
                         ,  list_color_data_for_put [ 2 ]   #arg_color_data_Green
                         ,  list_color_data_for_put [ 3 ]   #arg_color_data_Red
                                                    )
        return "Y"

    #------------------------------------------------------------
    def  decide_color_for_put (   self \
                      ,  arg_use_or_not_PatternImageData
                      ,  arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData

                      ,  arg_list_color_copying
                      ,  arg_color_rate_CopySource_to_InsertedSide

                      ,  arg_get_location_x
                      ,  arg_get_location_y

                      ,  arg_list_vector_from_BasicLocation_CopySource_to_arg_x_and_y
                      ,  arg_list_BasicLocation_x_and_y_on_Pattern_ImageData

                      ,  arg_put_location_x
                      ,  arg_put_location_y
                                         ) :

        methode_name = "decide_color_for_put"

       #print ( "==================================" )
       #print ( "Enter into , Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
       #                   + " , methode = " + methode_name )
       #print ( "==================================" )

        list_return = [ "Y" , 0 , 0 , 0 ]

        color_data_CopySource = \
               self.iv_list_ImageDataTwoDimensionHandling [ 0 ]    \
                    .get_data_of_one_pixel ( \
                             CopyAndInsertImageDataV3.CV_CLASS_NAME
                          ,  methode_name
                              # in the commonly used mathematical XY cordinates
                          ,  arg_get_location_x
                          ,  arg_get_location_y
                                                         )
        list_return [ 1 ] = color_data_CopySource [ 0 ]
        list_return [ 2 ] = color_data_CopySource [ 1 ]
        list_return [ 3 ] = color_data_CopySource [ 2 ]
       #-----------------------------------
        if (     \
                          # Blue
                                                                # from
              ( color_data_CopySource [ 0 ] < arg_list_color_copying [ 0 ] [ 0 ] )  \
              or \
                                                                # to
              ( color_data_CopySource [ 0 ] > arg_list_color_copying [ 1 ] [ 0 ] )  \
              or \
                          # Green
                                                                # from
              ( color_data_CopySource [ 1 ] < arg_list_color_copying [ 0 ] [ 1 ] )  \
              or \
                                                                # to
              ( color_data_CopySource [ 1 ] > arg_list_color_copying [ 1 ] [ 1 ] )  \
              or \
                           # Red
                                                                # from
              ( color_data_CopySource [ 2 ] < arg_list_color_copying [ 0 ] [ 2 ] )  \
              or \
                                                                # to
              ( color_data_CopySource [ 2 ] > arg_list_color_copying [ 1 ] [ 2 ] )  \
           )   :
                     # this location has color , that indicate, must not be copied
            list_return [ 0 ] = "N"

            return  list_return
        #----------------------------------------------
        if (  arg_use_or_not_PatternImageData == "Y" ) :
                             #use PatternImageData
            list_get_location_on_PatternImageData = [                                    \
                ( arg_list_BasicLocation_x_and_y_on_Pattern_ImageData [ 0 ]   \
                    + arg_list_vector_from_BasicLocation_CopySource_to_arg_x_and_y [ 0 ] )  \
                ,                                                                                              \
                 ( arg_list_BasicLocation_x_and_y_on_Pattern_ImageData [ 1 ]  \
                    + arg_list_vector_from_BasicLocation_CopySource_to_arg_x_and_y [ 1 ] )  \
                    ]
            #-----------------------------------
            if (  (  list_get_location_on_PatternImageData [ 0 ] < 0 )         \
                or                                                                                     \
                  (  list_get_location_on_PatternImageData [ 0 ] >=            \
                        self.iv_width_of_ImageData_Pattern )                         \
                or                                                                                     \
                   (  list_get_location_on_PatternImageData [ 1 ] < 0 )        \
                or                                                                                     \
                   (   list_get_location_on_PatternImageData [ 1 ] >=          \
                           self.iv_height_of_ImageData_Pattern )                    \
               ) :
                          # area over in Pattern --> not draw, no error message
                # print ( "==================================" )
                # print ( "Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
                #               + " , methode = " + methode_name )
                # print ( "arg_get_location_x = " \
                #           ,  arg_get_location_x )
                # print ( "arg_get_location_y = " \
                #           ,  arg_get_location_y )
                # print ( "list_get_location_on_PatternImageData = " \
                #           ,  list_get_location_on_PatternImageData   )
                # print ( "self.iv_width_of_ImageData_Pattern = " \
                #           ,  self.iv_width_of_ImageData_Pattern )
                # print ( "self.iv_height_of_ImageData_Pattern = " \
                #           ,  self.iv_height_of_ImageData_Pattern )
                # print ( "arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData = " \
                #           ,  arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData )
                # print ( "==================================" )

                # time.sleep ( 5 )

                list_return [ 0 ] = "N"
                return  list_return

            # print ( "==================================" )
            # print ( "Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
             #                  + " , methode = " + methode_name )
            # print ( "arg_get_location_x = " \
            #               ,  arg_get_location_x )
            # print ( "arg_get_location_y = " \
            #               ,  arg_get_location_y )
            # print ( "list_get_location_on_PatternImageData = " \
            #               ,  list_get_location_on_PatternImageData   )
            # print ( "self.iv_width_of_ImageData_Pattern = " \
             #              ,  self.iv_width_of_ImageData_Pattern )
            # print ( "self.iv_height_of_ImageData_Pattern = " \
             #              ,  self.iv_height_of_ImageData_Pattern )
            # print ( "arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData = " \
            #               ,  arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData )
            # print ( "==================================" )

            # time.sleep ( 5 )

                #-----------------------
            color_data_PatternImageData = \
                  self.iv_list_ImageDataTwoDimensionHandling [ 1 ]    \
                      .get_data_of_one_pixel ( \
                               CopyAndInsertImageDataV3.CV_CLASS_NAME
                           ,  methode_name
                                    # in the commonly used mathematical XY cordinates
                           ,  list_get_location_on_PatternImageData [ 0 ]
                           ,  list_get_location_on_PatternImageData [ 1 ]
                                                         )

           # print ( "==================================" )
           # print ( "Class = "  + CopyAndInsertImageDataV3.CV_CLASS_NAME
           #                   + " , methode = " + methode_name )
           # print ( "arg_get_location_x = " \
           #               ,  arg_get_location_x )
           # print ( "arg_get_location_y = " \
           #               ,  arg_get_location_y )
           # print ( "color_data_PatternImageData = " \
           #               ,  color_data_PatternImageData )
           # print ( "arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData = " \
           #               ,  arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData )
           # print ( "==================================" )

                          #----------------------------
            if (  ( color_data_PatternImageData  [ 0 ] !=                                                          \
                        arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData [ 0 ] )       \
                  or                                                                                                                  \
                  ( color_data_PatternImageData  [ 1 ] !=                                                          \
                        arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData [ 1 ] )       \
                  or                                                                                                                  \
                  ( color_data_PatternImageData  [ 2 ] !=                                                          \
                           arg_list_color_of_pixel_directed_x_and_y_on_PatternImageData [ 2 ] )   \
              ) :
                           #color on ( x , y ) , not equal,
                           #     color_of_pixel_directed_x_and_y_on_PatternImageData
                           #   , so , this pixel must not be copied
                list_return [ 0 ] = "N"
                return  list_return
          #----------------------------------------------------
        color_data_InsertedSideSource = \
               self.iv_list_ImageDataTwoDimensionHandling [ 2 ]   \
                    .get_data_of_one_pixel (      \
                          CopyAndInsertImageDataV3.CV_CLASS_NAME
                       ,  methode_name
                              # in the commonly used mathematical XY cordinates
                       ,  arg_put_location_x
                       ,  arg_put_location_y
                                                       )
          #------- mix color ---------------------------------------------
        for i in range ( 0 , 3 ) :
            w_color_CopySource = \
                        color_data_CopySource [ i ] \
                           * arg_color_rate_CopySource_to_InsertedSide
            w_color_InsertedSideSource =  \
                        color_data_InsertedSideSource [ i ] \
                           * (  1.0 - arg_color_rate_CopySource_to_InsertedSide )
            w_color_mixed = int ( w_color_CopySource +  w_color_InsertedSideSource )

            index_for_return = i + 1
            list_return [ index_for_return ] = w_color_mixed
            if (  w_color_mixed < 0 ) :
               list_return [ index_for_return ] = 0
            if (  w_color_mixed >  255 ) :
               list_return [ index_for_return ] = 255

     #----------------------------------------
        return  list_return

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

----------

----------
6  [ TestCopyAndInsertImageDataV3 ]

ファイル名 [ TestCopyAndInsertImageDataV3.py ]

下記ソースリスト中の、
Test 1 の部分が動くことにより、
 2 で述べた、 [Fig 4]の画像 が、作成された。
Test 2 の部分が動くことにより、
 2 で述べた、 [Fig 5]の画像 が、作成された。

----------


import  CopyAndInsertImageDataV3

#=====================================
# Test
#=====================================

module_name = "___"
function_name = "Test"

#***************************************
abs_path_of_CopySource_ImageData      \
        = "E:ForPython/ForTest/Test_12V3/ImageData_CopySource.png"
abs_path_of_Pattern_ImageData      \
        = "E:ForPython/ForTest/Test_12V3/ImageData_Pattern.png"
abs_path_of_InsertedSide_ImageData    \
        = "E:ForPython/ForTest/Test_12V3/ImageData_Source.png"
 #--------------------------------------
list_directed_x_and_y_on_PatternImageData = [ 150 , 200 ]

list_color_copying = [ [ 0 , 0 , 0 ] , [ 253 , 253 , 253 ] ]
list_CopySource_From_and_To_xy = [ [ 0 , 0 ] , [ 499 , 499 ] ]

scale_rate_CopySource_to_InsertedSide = 0.7
color_rate_CopySource_to_InsertedSide = 0.5

list_BasicLocation_x_and_y_on_CopySource_ImageData  = [ 250 , 250 ]
list_BasicLocation_x_and_y_on_Pattern_ImageData = [ 150 , 250 ]
list_BasicLocation_x_and_y_on_InsertedSide_ImageData = [ 500 , 400 ]

rotation_degree_of_inserting_on_InsertedSide_Source = 30

#*******************************************
ins_CopyAndInsertImageDataV3 = \
            CopyAndInsertImageDataV3        \
                   .CopyAndInsertImageDataV3 ( )
        #---------------------------
ins_CopyAndInsertImageDataV3            \
               .construct_ImageData ( 0  )
ins_CopyAndInsertImageDataV3            \
               .load_ImageData (  0 ,  abs_path_of_CopySource_ImageData )
        #---------------------------
ins_CopyAndInsertImageDataV3            \
               .construct_ImageData ( 1  )
ins_CopyAndInsertImageDataV3            \
               .load_ImageData (  1 ,  abs_path_of_Pattern_ImageData )
        #---------------------------
ins_CopyAndInsertImageDataV3            \
               .construct_ImageData ( 2  )
ins_CopyAndInsertImageDataV3            \
               .load_ImageData (  2 ,  abs_path_of_InsertedSide_ImageData )
        #---------------------------
ins_CopyAndInsertImageDataV3            \
               .construct_ImageData ( 3  )

               #===== Test 1 ==============================
ins_CopyAndInsertImageDataV3            \
               .load_ImageData (  3 ,  abs_path_of_InsertedSide_ImageData )

ins_CopyAndInsertImageDataV3   \
    .copy_and_insert_ImageData (
                            "N"   # arg_use_or_not_PatternImageData
                         ,  list_directed_x_and_y_on_PatternImageData

                         ,  list_color_copying
                         ,  list_CopySource_From_and_To_xy
                         ,  scale_rate_CopySource_to_InsertedSide
                         ,  color_rate_CopySource_to_InsertedSide

                         ,  list_BasicLocation_x_and_y_on_CopySource_ImageData
                         ,  list_BasicLocation_x_and_y_on_Pattern_ImageData
                         ,  list_BasicLocation_x_and_y_on_InsertedSide_ImageData

                         ,  "Y"   # arg_do_rotation
                         ,  rotation_degree_of_inserting_on_InsertedSide_Source
                                               )
                   #-------------------------
abs_path_of_InsertedSide_Generated_ImageData    \
        = "E:ForPython/ForTest/Test_12V3/Output_1.png"
ins_CopyAndInsertImageDataV3   \
    .write_InsertedSide_Generated_ImageData (   \
                    abs_path_of_InsertedSide_Generated_ImageData
                                                                      )

        #===== Test 2 ==============================
ins_CopyAndInsertImageDataV3            \
               .load_ImageData (  3 ,  abs_path_of_InsertedSide_ImageData )

ins_CopyAndInsertImageDataV3   \
        .copy_and_insert_ImageData (
                            "Y"   # arg_use_or_not_PatternImageData
                         ,  list_directed_x_and_y_on_PatternImageData

                         ,  list_color_copying
                         ,  list_CopySource_From_and_To_xy
                         ,  0.99  #scale_rate_CopySource_to_InsertedSide
                         ,  0.8    #color_rate_CopySource_to_InsertedSide

                         ,  list_BasicLocation_x_and_y_on_CopySource_ImageData
                         ,  list_BasicLocation_x_and_y_on_Pattern_ImageData
                         ,  list_BasicLocation_x_and_y_on_InsertedSide_ImageData

                         ,  "N"   # arg_do_rotation
                         ,  rotation_degree_of_inserting_on_InsertedSide_Source
                                               )
       #-------------------------
abs_path_of_InsertedSide_Generated_ImageData    \
        = "E:ForPython/ForTest/Test_12V3/Output_2.png"
ins_CopyAndInsertImageDataV3   \
    .write_InsertedSide_Generated_ImageData (   \
                    abs_path_of_InsertedSide_Generated_ImageData
                                                                      )

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

----------

----------


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


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