見出し画像

【初心者向け】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_ptsdst_ptsに格納します。これらのポイントは、後で画像を変換する際に使用します。

# ホモグラフィ行列を計算
M, mask = cv.findHomography(dst_pts, src_pts, cv.RANSAC, 5.0)

cv.findHomographyを使って、ホモグラフィ行列を計算します。ホモグラフィ行列は、画像間の変換を表す行列で、これを使って一方の画像を他方の画像に合わせて変換できます。

# img2を変換
img2_transform = cv.warpPerspective(img2, M, (wA, hA))

ホモグラフィ行列を使って、img2img1に合わせて変換します。これにより、二つの画像が同じ視点で比較できるようになります。

# 画像の差分を計算
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を使って、二つの画像の間違い探しプログラムを作成しました。各ステップを丁寧に説明しましたので、初心者の方でも理解しやすかったと思います。ぜひ、自分の画像を使って試してみてください。

ここから先は

1,235字 / 1画像

¥ 200

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?