【初心者向け】Pythonで簡単にできる!画像の間違い探しプログラムの作り方
はじめに
画像の間違い探しは、視覚的なパズルとして楽しまれています。今回はPythonを使って、二つの画像の違いを見つけるプログラムを作成します。このプログラムは、コンピュータビジョンライブラリOpenCVと特徴量検出器AKAZEを使用して、二つの画像の違いを検出し、視覚的に表示します。初心者の方でも理解しやすいように、コードの各ステップを丁寧に説明します。
ステップ1: 必要なライブラリのインストール
まずは必要なライブラリをインストールしましょう。以下のコマンドを使って、OpenCVとMatplotlibをインストールします。
pip install opencv-python-headless matplotlib numpy
ステップ2: コードの実装
次に、画像の間違い探しを実装するためのPythonコードを以下に示します。このコードをコピーして、自分のPython環境で実行してください。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
ここでは、必要なライブラリをインポートしています。numpyは数値計算を、cv2はOpenCVを、pyplotはMatplotlibを使って画像を表示するために使用します。
# 画像ファイルのパスを設定
path = 比較対象のデータ
path2 = 比較用のデータ
path3 = 保管先
次に、比較する2つの画像と、結果を保存するためのファイルパスを設定します。ここではローカル環境のファイルパスを指定しています。
# 画像を読み込み、RGB形式に変換
img1 = cv.imread(path)
img2 = cv.imread(path2)
img1 = cv.cvtColor(img1, cv.COLOR_BGR2RGB)
img2 = cv.cvtColor(img2, cv.COLOR_BGR2RGB)
ここでは、cv.imreadを使って画像を読み込み、cv.cvtColorを使って画像をBGR形式からRGB形式に変換しています。OpenCVはデフォルトで画像をBGR形式で読み込むため、RGB形式に変換する必要があります。
# 画像のサイズを取得
hA, wA = img1.shape[:2]
画像の高さと幅を取得します。これは後で画像を変換する際に必要になります。
# AKAZE特徴量検出器を作成
akaze = cv.AKAZE_create()
kpts1, desc1 = akaze.detectAndCompute(img1, None)
kpts2, desc2 = akaze.detectAndCompute(img2, None)
次に、AKAZE特徴量検出器を作成し、画像から特徴点(キー ポイント)とその記述子(ディスクリプター)を検出します。detectAndComputeメソッドは、画像から特徴点を検出し、それぞれの特徴点に対応する記述子を計算します。
# BFMatcherで特徴量をマッチング
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
matches = bf.match(desc1, desc2)
特徴点の記述子を基に、二つの画像間の対応する特徴点をBFMatcherを使ってマッチングします。ここでは、Hamming距離を基準にして、記述子を比較しています。
# マッチングポイントを取得
src_pts = np.float32([kpts1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kpts2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
マッチングした特徴点の座標を取得し、それぞれsrc_ptsとdst_ptsに格納します。これらのポイントは、後で画像を変換する際に使用します。
# ホモグラフィ行列を計算
M, mask = cv.findHomography(dst_pts, src_pts, cv.RANSAC, 5.0)
cv.findHomographyを使って、ホモグラフィ行列を計算します。ホモグラフィ行列は、画像間の変換を表す行列で、これを使って一方の画像を他方の画像に合わせて変換できます。
# img2を変換
img2_transform = cv.warpPerspective(img2, M, (wA, hA))
ホモグラフィ行列を使って、img2をimg1に合わせて変換します。これにより、二つの画像が同じ視点で比較できるようになります。
# 画像の差分を計算
result = cv.absdiff(img1, img2_transform)
cv.absdiffを使って、二つの画像の差分を計算します。これにより、二つの画像の違いが強調されます。
# 差分画像をグレースケールに変換
result_gray = cv.cvtColor(result, cv.COLOR_BGR2RGB)
差分画像をグレースケールに変換します。これにより、差分が視覚的にわかりやすくなります。
# 元の画像と差分画像を合成
result_add = cv.addWeighted(img1, 0.3, result_gray, 0.7, 60)
元の画像と差分画像を合成します。ここでは、元の画像を30%、差分画像を70%の比率で合成し、視覚的に差分がわかりやすい画像を作成しています。
# 画像を表示
plt.imshow(result_add)
plt.show()
plt.imshowを使って、合成画像を表示します。plt.showを呼び出して、画像を表示します。
# 画像を保存
if cv.imwrite(path3, result_add):
print('Image saved successfully')
else:
print('Failed to save image')
最後に、合成画像を指定したパスに保存します。保存が成功した場合は「Image saved successfully」と表示し、失敗した場合は「Failed to save image」と表示します。
まとめ
今回のチュートリアルでは、PythonとOpenCVを使って、二つの画像の間違い探しプログラムを作成しました。各ステップを丁寧に説明しましたので、初心者の方でも理解しやすかったと思います。ぜひ、自分の画像を使って試してみてください。
ここから先は
¥ 200
この記事が気に入ったらサポートをしてみませんか?