[画像中の 区域の面積の おおよその値を 求める], Python(パイソン) 使って作ってみた ,ソースプログラムリスト あり
Python(パイソン) プログラム作ってみた インデックス へ
-----
2024.8.30 presented in [note] ( //note.com/runningWater/ )
----------
1 はじめに
これ以降に記述されている内容は、このようなコンピューター・プログラムを制作した、というような事を、ただ、述べているに過ぎない。
以下の記述を読んだ人が、それを単に参考にする、というのであれば、問題は無いと、思われる。
しかし、記述されている内容に沿って、その人が、そこに記されているのと同様の制作や作業を行った際に、その制作、作業、コンピューターの作動の結果、使用されたコンピューター等、様々な方面において、何らかの問題が発生しない、という保証は、全くない。
その制作、作業、コンピューターの作動の結果、その人や、その人が所属している組織、その人が使用した様々な機器、インフラストラクチャー等の、身の上にどのような事が起ころうとも、私は一切、責任を負わない。
このプログラムは、Python(パイソン) 言語を使って、記述されている。
----------
2 どんなものを作ったのか
画像の中に描かれた、ある区域の面積の、おおよその値を、算出する、
と、いうようなものを、作ってみた。
例えば、
下図のような画像を与えると、
画像中の、赤色でぬりつぶされた区域の、おおよその面積の値が、算出され、表示される、下記のように。
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] 実行時には、下記のような画像が生成され、それを読み取って、下記のように、算出された。
pixcel_counter = 600
value_SquarePixels = 0.06
value_SquareMeters = 6.0
-----
[Test_2] 実行時には、下記のような画像が生成され、それを読み取って、下記のように、算出された。
pixcel_counter = 600
value_SquarePixels = 0.06
value_SquareMeters = 6.0
-----
[Test_3] 実行時には、下記のような画像が生成され、それを読み取って、下記のように、算出された。
pixcel_counter = 11142
value_SquarePixels = 1.1142
value_SquareMeters = 111.42
-----
[Test_4] 実行時には、下記の画像が読み込まれ、それに対して、処理が行われ、下記のように、算出された。
pixcel_counter = 12284
value_SquarePixels = 1.2284
value_SquareMeters = 122.83999999999999
-----
[Test_5] 実行時には、下記の画像が読み込まれ、それに対して、処理が行われ、下記のように、算出された。
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
)
----------