PythonのOpenCVを使わない画像処理

目 次

OpenCVとPythonよりお手軽に,PythonのPIL(Python Image Library)の管理を引き継いだPillowで画像処理を行います。

使用 Pillow 8.2.0
2023.11.09

バージョンの確認

まずはバージョンを確認しましょう.リスト中のPillowで確認できます。

実行例
pip list

ページの先頭へ

画像の表示

Pillow:PIL(Python Image Library)のライブラリを呼び出して,01_imgという名前のフォルダにあるモノクロ8bitのimg000001.bmpという名前のビットマップファイルをimgという名前に渡して表示します。
test.pyなどで保存して,python .\test.pyとコマンド実行すると確認出来ます。

実施例
#from module or package import function of module or package
from PIL import Image

#Open and show image file in 01_img folder as img
img = Image.open("01_img/img000001.bmp")
img.show()

ページの先頭へ

画像の二値化

Pillow:PIL(Python Image Library)のpointメソッドを使用して,01_imgという名前のフォルダにあるモノクロ8bitのimg000001.bmpという名前の連番ビットマップファイルを 02_bin_imgというフォルダを作って,しきい値(thred)30でimg000001_binarized.bmpという名前で二値化して保存します。フォルダの読み込む画像がなくなるとループが止まります。
test.pyなどで保存して,python .\test.pyとコマンド実行すると確認出来ます。

実施例
#from module or package import function of module or package
from PIL import Image
import os
thred =30
img_input_directory = "01_img"
img_input_header = "img"
img_output_directory ="02_bin_img"
img_output_header = "img_binarized"

#make output folder
if not os.path.exists(img_output_directory):
   os.makedirs(img_output_directory)
   print(f"{img_output_directory} make directory")
else:
   print(f"{img_output_directory} directory existed")

img_number =1
while True:
#Open image file in 01_img folder as img
   img_input = os.path.join(img_input_directory,f"{img_input_header}{img_number:06d}.bmp")
   if not os.path.exists(img_input):
     break
   img = Image.open(img_input)

   #convert to grayscale
   grayscaled = img.convert('L')

   #Binarized image
   binarized_image = grayscaled.point(lambda x: 0 if x < thred else 255, '1')

   #make image object and save
   output_filename = f"{img_output_header}{img_number:06d}.bmp"
   result = os.path.join(img_output_directory,output_filename)
   binarized_image.save(result)
   print(f"Processing image {img_number}...")

   img_number += 1

ページの先頭へ

画像のフィルタ

Gaussian filter,Median filter,Mode filterは,filtered_img = img.filter()の()内で書き換えて実行すると結果を表示します。
test.pyなどで保存して,python .\test.pyとコマンド実行すると確認出来ます。

実行例
#from module or package import function of module or package
from PIL import Image,ImageFilter
import numpy as np
from matplotlib import pylab as plt
import os #make directry

img_input = "01_img/img000001.bmp"
img_output_directory ="02_med_img"
img_output = "img000001_filtered.bmp"

if not os.path.exists(img_output_directory):
os.makedirs(img_output_directory)
print(f"{img_output_directory} make directry")
else:
print(f"{img_output_directory} directry existed")

#Open and show image file in 01_img folder as img
img = Image.open(img_input)

#Gaussian filter ImageFilter.GaussianBlur(1.0) ImageFilter.GaussianBlur(1.5) ImageFilter.GaussianBlur(3.0)
#Median filter img.filter(ImageFilter.MedianFilter())
#Mode filter img.filter(ImageFilter.ModeFilter(size = 25))
filtered_img = img.filter(ImageFilter.GaussianBlur(1.0))

#make image object and save
result_path = os.path.join(img_output_directory, img_output)
filtered_img.save(result_path)

#show the image
filtered_img.show()

ページの先頭へ

実行ファイル出力

誰かに使って貰う場合や,bat処理する際に実行ファイルがあると便利です。この例ではtest.pyからtest.exeの実行ファイル出力を行います。まずはPyInstallerを導入しましょう。

実行例
pip install pyinstaller

導入を確認して,以下のように実行するとtest.exeが得られます。

実行例
pyinstaller test.py --onefile

ページの先頭へ

画像の切り出し

Bitmapを切り出す際は、横画素数が4の倍数になるように切り出します。(700, 84, 1824, 996)は切り出す左下と右上のxy座標点です。
test.pyなどで保存して,python \test.pyとコマンド実行すると確認出来ます。インデントは適宜つけてください。 入力画像は00_RTフォルダに保存したRT (1).Bmpの括弧内の数字が変化する連番ファイルです。出力は01_cut_imgのフォルダに保存されます。

実行例
#from module or package import function of module or package
from PIL import Image
import os
thred =30
img_input_directory = "00_RT"
img_input_header = "RT"
img_output_directory ="01_cut_img"
img_output_header = "cut_img"

#Triming range
x_min=700
y_min=84
x_max=1824
y_max=996
#make output folder
if not os.path.exists(img_output_directory):
os.makedirs(img_output_directory)
print(f"{img_output_directory} make directory")
else:
print(f"{img_output_directory} directory existed")

img_number =1
while True:
#Open image file in 01_img folder as img
img_input = os.path.join(img_input_directory,f"{img_input_header} ({img_number:d}).Bmp")
print(f"Processing image {img_input}...")
if not os.path.exists(img_input):
break
img = Image.open(img_input)
img_roi = img.crop((x_min, y_min, x_max, y_max))
output_filename = f"{img_output_header}{img_number:06d}.bmp"
result = os.path.join(img_output_directory,output_filename)
img_roi.save(result)
#convert to grayscale

print(f"Processing image {img_number}...")

img_number += 1

ページの先頭へ



© Measurement System Laboratory, Kyoto Institute of Technology.