[画像中の 区域の面積の おおよその値を 求める], Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり

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

-----
2024.8.30 presented in [note] ( //note.com/runningWater/ )

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

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

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

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

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

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

----------
2 どんなものを作ったのか

画像の中に描かれた、ある区域の面積の、おおよその値を、算出する、

と、いうようなものを、作ってみた。

例えば、

下図のような画像を与えると、

Fig 1

画像中の、赤色でぬりつぶされた区域の、おおよその面積の値が、算出され、表示される、下記のように。

pixcel_counter = 12284
value_SquarePixels = 1.2284
value_SquareMeters = 122.83999999999999

[value_SquareMeters] に示されている数値が、[おおよその面積](平方メートル)、ということになる。

このモジュールを動かす際には、以下のような前提条件が満たされている、というように、設定した。

(1) 面積・算出対象としたいエリアが、画像上で、赤色で塗りつぶされている
 かつ
(2) 画像の縮尺が、設定されている
 縮尺は、画像上の[100 ピクセル × 100 ピクセル] のエリアが、何平方メートルに相当するか、という値でもって、指定する、というようにした。

このモジュールを動かすことによって、算出される面積値は、あくまでも、おおよその値、ということになるだろう。

かりに、何らかの、実在する土地の区域を表したような画像を、このモジュールに適用したとしても、その区域の面積の正確な値を算出することは、できないだろう、何らかの誤差が発生することが、予想される。

その画像の内容が、土地の区域の形状を、正確に表現しているかどうか、という事が、問題になるだろう。
境界線が、どれくらいの太さで、画像上に描かれているか、というような事も、問題になるだろう。
対象となる区域が、赤色ですきまなく塗りつぶされているか、という事も、問題になるだろう。
画像の縮尺には、どのような値が設定されているのか、という事も、問題になるだろう。
他にも、いろいろな事が問題となってくるだろう。

----------
3 基本的な考え

基本的な考え方は、

 画像中の、赤色になっているピクセルの総数
 と
 画像中の、赤色で塗りつぶされている区域の面積
 は、正比例の関係にあるだろう
 
と、いうことである。

だから、

(1) 画像中の、赤色になっているピクセルの総数 を、割り出し、
(2) それに、一定の数を、かけたら、面積値が、出てくるだろう

というように、考えた。

----------
4 使用する他モジュール

このモジュールは、必要に応じて、下記に解説されているモジュールを、使用している。

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

下記のモジュールは、上記のモジュールに、使用されている。

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

----------
5 プログラムが動作した様

後述の、プログラムの内容の中に、

# Test Run

と、記されている箇所があり、その中の以下2か所について、説明を述べる。

(1) 縮尺の指定

[画像上の [100 ピクセル × 100 ピクセル] のエリアが、何平方メートルに相当するか] を、下記のように、指定した。

scale_100_100_pixels_to_SquareMeters = 100

(2) 5とおりの指定をされた区域に対して、動作を行えるようにした

下記の箇所の記述を、書き換えることにより、様々な画像に対してのテストを行えるように、した。


# abs_path_of_ImageData_for_Test = prepare_for_Test_1 (  abs_path_of_ImageData_Source )

# abs_path_of_ImageData_for_Test = prepare_for_Test_2 (  abs_path_of_ImageData_Source )

# abs_path_of_ImageData_for_Test  = prepare_for_Test_3 (  abs_path_of_ImageData_Source )

# abs_path_of_ImageData_for_Test = prepare_for_Test_4 (  abs_path_of_ImageData_Source )

abs_path_of_ImageData_for_Test = prepare_for_Test_5 (  abs_path_of_ImageData_Source )

上記中の、「#」 の付記を変更して、[prepare_for_Test_1]を実行する、あるいは、[prepare_for_Test_2]を実行する、というように、して、様々な画像に対するテストを行えるようにした。

-----
[Test_1] 実行時には、下記のような画像が生成され、それを読み取って、下記のように、算出された。

Fig 2

pixcel_counter = 600
value_SquarePixels = 0.06
value_SquareMeters = 6.0

-----
[Test_2] 実行時には、下記のような画像が生成され、それを読み取って、下記のように、算出された。

Fig 3

pixcel_counter = 600
value_SquarePixels = 0.06
value_SquareMeters = 6.0

-----
[Test_3] 実行時には、下記のような画像が生成され、それを読み取って、下記のように、算出された。

Fig 4

pixcel_counter = 11142
value_SquarePixels = 1.1142
value_SquareMeters = 111.42

-----
[Test_4] 実行時には、下記の画像が読み込まれ、それに対して、処理が行われ、下記のように、算出された。

Fig 5

pixcel_counter = 12284
value_SquarePixels = 1.2284
value_SquareMeters = 122.83999999999999

-----
[Test_5] 実行時には、下記の画像が読み込まれ、それに対して、処理が行われ、下記のように、算出された。

Fig 6

pixcel_counter = 12284
value_SquarePixels = 1.2284
value_SquareMeters = 122.83999999999999

----------
6 プログラムの内容

作ったプログラムは、以下のとおり。

===============
ファイル名 [ CalculateAreaOfZone.py ]


import math

#=============================
# CalculateAreaOfZone
#     calculate Area of the Zone, directed by ImageData
#=============================

import  ImageDataTwoDimensionHandling

MODULE_NAME = "CalculateAreaOfZone"

    #------------------------------------------------------------
def calculate_area_of_zone ( \
                arg_abs_path_of_ImageData
             ,  arg_scale_100_100_pixels_to_SquareMeters
                            ) :

    function_name = "calculate_are_of_zone"

    print ( "==================================" )
    print ( "Enter into , Module = " + MODULE_NAME
                      + " , function = " + function_name )

    print ( "arg_abs_path_of_ImageData = " \
         + arg_abs_path_of_ImageData )
    print ( "==================================" )

    ins_ImageDataTwoDimensionHandling = \
         ImageDataTwoDimensionHandling   \
            .ImageDataTwoDimensionHandling ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
                                        )
    ins_ImageDataTwoDimensionHandling  \
         .load_image_data ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , arg_abs_path_of_ImageData
                      )
    width_of_ImageData = \
         ins_ImageDataTwoDimensionHandling \
             .get_width_of_ImageData ( )
    height_of_ImageData = \
         ins_ImageDataTwoDimensionHandling \
             .get_height_of_ImageData ( )

    print ( "==================================" )
    print ( "Module = " + MODULE_NAME
                      + " , function = " + function_name )
    print ( "arg_abs_path_of_ImageData = " \
             + arg_abs_path_of_ImageData )
    print ( "width_of_ImageData = " , width_of_ImageData )
    print ( "height_of_ImageData = " , height_of_ImageData )
    print ( "==================================" )

    detect_x = 0
    detect_y = 0
    result_of_detect_color = " "
    pixcel_counter = 0

    while ( detect_x < width_of_ImageData ) :

        detect_y = 0
        while ( detect_y < height_of_ImageData ) :

            result_of_detect_color = \
                detect_color_of_one_pixel ( \
                      detect_x \
                    , detect_y \
                    , ins_ImageDataTwoDimensionHandling
                                         )
            if ( result_of_detect_color == "Y" ) :
                pixcel_counter += 1

            detect_y += 1

        detect_x += 1

    print ( "pixcel_counter = " + str ( pixcel_counter ) )

    value_SquarePixels =                          \
           ( float ( pixcel_counter ) )            \
            /                                      \
            (                                     \
              ( float ( 100 ) )                    \
              *                                  \
              ( float ( 100 ) )                   \
            )
    value_SquareMeters =                              \
           value_SquarePixels                         \
           *                                          \
           arg_scale_100_100_pixels_to_SquareMeters

    print ( "value_SquarePixels = " + str ( value_SquarePixels ) )
    print ( "value_SquareMeters = " + str ( value_SquareMeters ) )

    print ( "==================================" )
    print ( "Exit from into , Module = " + MODULE_NAME
                      + " , function = " + function_name )
    print ( "==================================" )

        #------------------------------------------------
def detect_color_of_one_pixel ( \
                       arg_get_location_x  \
                     , arg_get_location_y  \
                     , arg_ins_ImageDataTwoDimensionHandling
                      ) :

    function_name = "detect_color_of_one_pixel"

      #--------------------
    return_value = "N"

    get_color = \
           arg_ins_ImageDataTwoDimensionHandling \
              .get_data_of_one_pixel ( \
                    MODULE_NAME #  arg_requester_module
                  , function_name   # arg_requester_function
                              # in the commonly used mathematical XY cordinates
                  , arg_get_location_x
                  , arg_get_location_y
                                  )

    if ( ( get_color [ 2 ] > 200 )   \
             and                          \
             ( get_color [ 0 ] < 200 )   \
             and                          \
             ( get_color [ 1 ] < 200 )   \
           ) :
           # color Red , found pixel
        return_value = "Y"
        return return_value

    return  return_value

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

        #------------------------------------------------
def prepare_for_Test_1 (         \
           arg_abs_path_of_ImageData_Source ) :

    return_abs_path = "E:Test_4/test_1.png"

    ins_ImageDataTwoDimensionHandling_1 = \
         ImageDataTwoDimensionHandling   \
            .ImageDataTwoDimensionHandling ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
                                       )
    ins_ImageDataTwoDimensionHandling_1  \
         .load_image_data ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , arg_abs_path_of_ImageData_Source
                      )
    ins_ImageDataTwoDimensionHandling_1  \
         .write_loaded_image_data_to_directed_path ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )
         # -----------------------
    ins_ImageDataTwoDimensionHandling_2 = \
         ImageDataTwoDimensionHandling   \
            .ImageDataTwoDimensionHandling ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
                                       )
    ins_ImageDataTwoDimensionHandling_2  \
         .load_image_data ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )
       # ------------------------
    for x in range ( 30 ) :
        for y in range ( 20 ) :
            put_x = 100 + x
            put_y = 150 + y

            ins_ImageDataTwoDimensionHandling_2   \
               .put_data_of_one_pixel ( \
                           "___"  # arg_requester_module
                         , "_____"  # arg_requester_function
                              # in the commonly used mathematical XY cordinates
                         , put_x
                         , put_y
                         , 0    # arg_color_data_Blue
                         , 0    # arg_color_data_Green
                         , 255  # arg_color_data_Red
                               )
    ins_ImageDataTwoDimensionHandling_2  \
         .write_loaded_image_data_to_directed_path ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )

    return  return_abs_path

        #------------------------------------------------
def prepare_for_Test_2 (         \
           arg_abs_path_of_ImageData_Source ) :

    return_abs_path = "E:Test_4/test_2.png"

    ins_ImageDataTwoDimensionHandling_1 = \
         ImageDataTwoDimensionHandling   \
            .ImageDataTwoDimensionHandling ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
                                       )
    ins_ImageDataTwoDimensionHandling_1  \
         .load_image_data ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , arg_abs_path_of_ImageData_Source
                      )
    ins_ImageDataTwoDimensionHandling_1  \
         .write_loaded_image_data_to_directed_path ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )
         # -----------------------
    ins_ImageDataTwoDimensionHandling_2 = \
         ImageDataTwoDimensionHandling   \
            .ImageDataTwoDimensionHandling ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
                                       )
    ins_ImageDataTwoDimensionHandling_2  \
         .load_image_data ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )
       # ------------------------
    for x in range ( 30 ) :
        for y in range ( 20 ) :
            put_x = 100 + y + x
            put_y = 150 + y

            ins_ImageDataTwoDimensionHandling_2   \
               .put_data_of_one_pixel ( \
                           "___"  # arg_requester_module
                         , "_____"  # arg_requester_function
                              # in the commonly used mathematical XY cordinates
                         , put_x
                         , put_y
                         , 0    # arg_color_data_Blue
                         , 0    # arg_color_data_Green
                         , 255  # arg_color_data_Red
                               )
    ins_ImageDataTwoDimensionHandling_2  \
         .write_loaded_image_data_to_directed_path ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )

    return  return_abs_path

        #------------------------------------------------
def prepare_for_Test_3 (         \
           arg_abs_path_of_ImageData_Source ) :

    return_abs_path = "E:Test_4/test_3.png"

    ins_ImageDataTwoDimensionHandling_1 = \
         ImageDataTwoDimensionHandling   \
            .ImageDataTwoDimensionHandling ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
                                       )
    ins_ImageDataTwoDimensionHandling_1  \
         .load_image_data ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , arg_abs_path_of_ImageData_Source
                      )
    ins_ImageDataTwoDimensionHandling_1  \
         .write_loaded_image_data_to_directed_path ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )
         # -----------------------
    ins_ImageDataTwoDimensionHandling_2 = \
         ImageDataTwoDimensionHandling   \
            .ImageDataTwoDimensionHandling ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
                                       )
    ins_ImageDataTwoDimensionHandling_2  \
         .load_image_data ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )
       # ------------------------
    for r in range ( 60 ) :

        angle = 0.0
        while ( angle < ( math.pi * 2.0 ) ) :
            put_x = int ( 200 + ( r * math.cos ( angle ) ) )
            put_y = int ( 200 + ( r * math.sin ( angle ) ) )

            ins_ImageDataTwoDimensionHandling_2   \
               .put_data_of_one_pixel ( \
                           "___"  # arg_requester_module
                         , "_____"  # arg_requester_function
                              # in the commonly used mathematical XY cordinates
                         , put_x
                         , put_y
                         , 0    # arg_color_data_Blue
                         , 0    # arg_color_data_Green
                         , 255  # arg_color_data_Red
                               )
            angle += 0.005

    ins_ImageDataTwoDimensionHandling_2  \
         .write_loaded_image_data_to_directed_path ( \
                 MODULE_NAME #  arg_requester_module
               , function_name   # arg_requester_function
               , return_abs_path
                      )

    return  return_abs_path

        #------------------------------------------------
def prepare_for_Test_4 (         \
           arg_abs_path_of_ImageData_Source ) :

    return_abs_path = "E:Test_4/test_4.png"

    return  return_abs_path

        #------------------------------------------------
def prepare_for_Test_5 (         \
           arg_abs_path_of_ImageData_Source ) :

    return_abs_path = "E:Test_4/test_5.png"

    return  return_abs_path




#=============================
# Test Run
#=============================

MODULE_NAME = "Test_Run"
function_name = "test_run"

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


abs_path_of_ImageData_Source = "E:Test_4/test_Source.png"
    #-------------------------------------

# abs_path_of_ImageData_for_Test = prepare_for_Test_1 (  abs_path_of_ImageData_Source )

# abs_path_of_ImageData_for_Test = prepare_for_Test_2 (  abs_path_of_ImageData_Source )

# abs_path_of_ImageData_for_Test  = prepare_for_Test_3 (  abs_path_of_ImageData_Source )

# abs_path_of_ImageData_for_Test = prepare_for_Test_4 (  abs_path_of_ImageData_Source )

abs_path_of_ImageData_for_Test = prepare_for_Test_5 (  abs_path_of_ImageData_Source )

       #--------------------------------
scale_100_100_pixels_to_SquareMeters = 100
calculate_area_of_zone ( \
                abs_path_of_ImageData_for_Test
             ,  scale_100_100_pixels_to_SquareMeters
                            )


----------

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

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