どうもニコイチです。本記事は、画像の欠陥を検出するモデル作成シリーズの第2回目です。
前回はシリーズ全体の概要と目的(画像の欠陥算出モデル作成)を紹介しましたが、今回は「画像読み込みと欠陥の確認」に焦点を当てます。
今回の目標:
- PythonのPillowライブラリを使い、画像データを読み込む方法を学ぶ
- 読み込んだ画像の基本情報(フォーマット、サイズ、モード)を確認する
- matplotlibを用いて画像を表示し、正常品と欠陥品の違いを視覚的に確認する
- ImageDrawを使った図形描画で、欠陥箇所(キズやバリなど)を強調するテクニックを習得する
使用するライブラリと環境の準備
まず、今回使用する主なライブラリとその用途を整理しましょう。以下の表は、各ライブラリの目的をまとめたものです。
ライブラリ名 | 用途 |
---|---|
numpy | 数値計算を行うため |
PIL (Pillow) | 画像の読み込み・加工、図形描画を行うため |
os | ファイルパスの管理をするため |
matplotlib | 画像を図として表示するため |
torch/torchvision | (後半で使用)画像認識モデル作成・データセット作成用 |
インポート例:
import numpy as np
from PIL import Image, ImageDraw
import os
import matplotlib.pyplot as plt
# torch, torchvisionは次回以降で使用するので今回は紹介のみです
画像の読み込みと基本情報の確認
Pythonで画像を扱う場合、Pillowライブラリを使うととても簡単です。
まずは、JPEG形式の画像を読み込み、画像の基本情報(フォーマット、サイズ、モード)を確認してみましょう。
画像の読み込み
PillowのImage.open()
を使って、画像ファイルを読み込みます。例えば、以下のコードでは正常品の画像cast_ok_0_1057.jpeg
を読み込んでいます。
from PIL import Image
# 画像の読み込み
im = Image.open('cast_ok_0_1057.jpeg')
基本情報の確認
読み込んだ画像の情報は、以下のようなプロパティで確認できます。
- フォーマット:
im.format
(例:JPEG) - サイズ:
im.size
(例:(300, 300)) - モード:
im.mode
(例:’RGB’)
具体的なコード例は以下の通りです。
print("フォーマット:", im.format) # 出力例: JPEG
print("サイズ:", im.size) # 出力例: (300, 300)
print("モード:", im.mode) # 出力例: RGB
【課題1】
読み込んだ画像のフォーマットとサイズを出力して、正しい情報が得られるか確認してみましょう。
画像の表示
画像の読み込みができたら、次はその画像を画面に表示してみましょう。
Pythonでは、matplotlibのimshow()
関数を使うと簡単に画像を表示することができます。
単体画像の表示方法
以下のコード例は、先ほど読み込んだ画像im
を表示する方法です。
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()
【課題2】
同じ方法で、欠陥画像(例:cast_def_0_1055.jpeg
)を読み込み、表示してみてください。
複数画像の表示(subplotの利用)
実際の製品検査では、正常品と欠陥品を並べて比較することが重要です。
matplotlibのsubplot()
を使うことで、複数の画像を同じ画面に並べて表示できます。
1行4列に画像を並べる例
以下のコードでは、1行4列に4つの画像を配置し、各画像にタイトルをつけて表示しています。
from PIL import Image
import matplotlib.pyplot as plt
# 画像の読み込み
im1 = Image.open('cast_ok_0_1057.jpeg')
im2 = Image.open('cast_ok_0_1028.jpeg')
im3 = Image.open('cast_def_0_1055.jpeg')
im4 = Image.open('cast_def_0_1056.jpeg')
# 1行4列のレイアウトで画像を配置
plt.subplot(1, 4, 1)
plt.imshow(im1)
plt.title('OK1')
plt.subplot(1, 4, 2)
plt.imshow(im2)
plt.title('OK2')
plt.subplot(1, 4, 3)
plt.imshow(im3)
plt.title('NG1')
plt.subplot(1, 4, 4)
plt.imshow(im4)
plt.title('NG2')
plt.tight_layout() # 余白の調整
plt.show()
【課題3】
上記の順番(im1, im2, im3, im4)で、画像を1行4列に並べて表示するコードを書いてみましょう。
画像への図形描画で欠陥箇所の強調
画像に対して、どこに欠陥(キズやバリ)があるのかを目立たせるために、図形を描画する方法を学びます。
ここでは、矩形と円形の2種類の図形描画方法を紹介します。
矩形描画によるキズの強調
PillowのImageDraw
モジュールを使用すると、画像上に矩形などの図形を描くことができます。
以下の例では、欠陥画像cast_def_0_1055.jpeg
のキズ部分に対して、矩形を描画します。
矩形の座標は[(40, 80), (110, 140)]
、アウトラインの色は赤、線の幅は3に設定しています。
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
# 欠陥画像の読み込み
im = Image.open('cast_def_0_1055.jpeg')
# ImageDrawオブジェクトの生成
d = ImageDraw.Draw(im)
# 矩形の描画(左上の座標と右下の座標を指定)
d.rectangle(xy=[(40, 80), (110, 140)], outline="red", width=3)
plt.imshow(im)
plt.show()
【課題4】
上記の条件(座標: [(40, 80), (110, 140)]、アウトライン: 赤、幅: 3)で、欠陥画像に対して矩形描画を行い、画像を表示してみましょう。
円形描画による欠陥箇所の強調
次に、円形を描画して欠陥箇所を強調する方法を説明します。
以下の例では、欠陥画像cast_def_0_131.jpeg
に対し、円形を描画します。
描画の座標は[(10, 10), (280, 280)]
、アウトラインの色は赤、幅は3に設定しています。
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
# 欠陥画像の読み込み
im = Image.open('cast_def_0_131.jpeg')
# ImageDrawオブジェクトの生成
d = ImageDraw.Draw(im)
# 円形の描画(左上の座標と右下の座標を指定)
d.ellipse(xy=[(10, 10), (280, 280)], outline="red", width=3)
plt.imshow(im)
plt.show()
【課題5】
指定された条件(座標: [(10, 10), (280, 280)]、アウトライン: 赤、幅: 3)で、欠陥画像に対して円形描画を行い、画像を表示してみましょう。
補足:
さらに、subplotを使って元の画像と図形描画後の画像を並べて比較する方法もおすすめです。下記はその例です。
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw
# 同じ画像を2つ読み込む(元画像と描画用)
im_original = Image.open('cast_def_0_1055.jpeg')
im_draw = Image.open('cast_def_0_1055.jpeg')
d = ImageDraw.Draw(im_draw)
d.rectangle(xy=[(40, 80), (110, 140)], outline="red", width=3)
plt.subplot(1, 2, 1)
plt.title("Original")
plt.imshow(im_original)
plt.subplot(1, 2, 2)
plt.title("Rectangle Drawn")
plt.imshow(im_draw)
plt.tight_layout()
plt.show()
理解度テストと練習問題
ここで、今回学んだ内容の理解を深めるために、簡単なテストと練習問題を出してみます。
簡単な復習クイズ
- Q1: 画像のフォーマットやサイズを確認するために使うメソッドは何ですか?
(答え:im.format
、im.size
、im.mode
など) - Q2:
subplot()
を使うメリットは何でしょうか?
(答え:複数の画像を一度に表示して比較できるためです。) - Q3:
plt.tight_layout()
の役割は何ですか?
(答え:図のレイアウトが重ならないように余白を自動調整するためです。)
練習課題
- 異なる画像ファイルを用いて、同様の図形描画(矩形や円形)を試してみましょう。
- 描画する図形の座標や幅を変更して、表示結果の違いを確認してみると良いでしょう。
まとめと次回予告
- 画像の読み込みと情報確認:
PillowのImage.open()
を使って画像を読み込み、im.format
、im.size
、im.mode
で基本情報を確認しました。 - 画像の表示方法:
matplotlibのplt.imshow()
とplt.show()
を使い、単体画像だけでなく、subplot()
を用いて複数画像を並べて表示する方法を学びました。 - 図形描画で欠陥箇所の強調:
ImageDrawのrectangle()
とellipse()
を使って、画像内の欠陥箇所を目立たせる方法を実践しました。
これらのテクニックは、実際の画像検査やデータ解析の際に非常に役立ちます。初心者の皆さんも、着実にステップアップしていけば必ず前進・成長していけると信じています!
次回予告
次回は「3.画像の特徴理解」として、読み込んだ画像からさらに細かな特徴量を抽出し、解析する方法にチャレンジします。
引き続き、実践的なコード例と具体的な解説で学びを深めていきましょう。
コメント