MENU

OpenCVで「間違い探し」自動化!見落としゼロの差分検出コード

深夜のオフィス、積み上がった資料の山。僕はもうろうとする目で、二枚の設計図をひたすら見比べていた。「ここ、少しだけ線が太い?」「いや、気のせいか…」。目の奥がジンジンと痛み、頭の奥では警鐘が鳴り響く。小さな違い一つ見落とせば、大きな手戻りや損害に繋がりかねない。そのプレッシャーが、僕の心を蝕んでいた。

「なぜ、こんな単純な作業に、僕の貴重な時間が奪われ続けるんだ…?」

心の声が、静まり返ったオフィスに響く気がした。毎日何時間も費やす品質チェックや資料比較。人間の集中力には限界がある。疲労がピークに達すると、まるで霧がかかったように視界がぼやけ、見落としへの恐怖が募る。家族との時間も削られ、心身ともに疲弊していく日々。「このままじゃ、いつか取り返しのつかないミスをしてしまう…」。僕は、そんな絶望の淵に立たされていた。

そんなある日、職場のベテランエンジニアの先輩が、僕の疲れた顔を見て言った。「画像処理で困ってるなら、OpenCVが鉄板だぞ」。その言葉が、僕の心に一筋の光を灯した。OpenCV?聞いたことはあるけれど、自分には縁のない高度な技術だと思っていた。しかし、もう後には引けない。僕は藁にもすがる思いで、OpenCVとPythonの学習を始めた。

最初は戸惑いの連続だった。画像の読み込み、グレースケール変換、閾値処理…。専門用語の壁にぶつかり、何度もエラーを吐いた。「本当に、こんなコードで『間違い探し』が自動化できるのか?」と半信半疑になることもあった。しかし、公式ドキュメントやオンラインのコミュニティを参考に、試行錯誤を重ねるうちに、少しずつOpenCVのロジックが見えてきた。

そして、ついにその日が来た。僕が書いたPythonコードが、二枚の画像の間にあるわずかな差分を、赤い四角で正確に囲み表示したのだ。その瞬間、全身に電気が走ったような感動を覚えた。「まさか、たった数行のコードで、こんなにも世界が変わるなんて…」。あの時感じた解放感と達成感は、今でも忘れられない。

OpenCVで「間違い探し」を自動化する魔法のコード

OpenCVを使って2枚の画像の差分を検出する基本的な流れはシンプルだ。まず、比較したい2枚の画像を読み込み、同じサイズに調整する。次に、画像をグレースケールに変換し、両画像の絶対差分を計算する。この差分画像に対して閾値処理を行い、明確な差分箇所を二値化する。最後に、二値化された画像から輪郭(違いの境界線)を検出し、元の画像にその輪郭を赤い四角で描画すれば完成だ。

“`python

import cv2

import numpy as np

def find_differences(image_path1, image_path2):

2枚の画像を読み込む

img1 = cv2.imread(image_path1)

img2 = cv2.imread(image_path2)

if img1 is None or img2 is None:

print(“Error: Could not read one or both images.”)

return

同じサイズにリサイズする(必要であれば)

例: img2をimg1のサイズに合わせる

img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))

比較結果を表示するためのコピーを作成

diff_display = img1.copy()

グレースケールに変換

gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

2枚の画像の絶対差分を計算

diff = cv2.absdiff(gray1, gray2)

差分画像に対して閾値処理を行い、二値化

閾値処理で、差分が大きいピクセルを白(255)、小さいピクセルを黒(0)にする

_, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

ノイズ除去(任意)

kernel = np.ones((5,5), np.uint8)

thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)

thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)

輪郭を検出

cv2.findContoursの返り値はOpenCVのバージョンによって異なる場合がある

contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

検出された輪郭を元の画像に描画

for contour in contours:

小さすぎる輪郭は無視する(ノイズ対策)

if cv2.contourArea(contour) < 100:

continue

x, y, w, h = cv2.boundingRect(contour)

cv2.rectangle(diff_display, (x, y), (x + w, y + h), (0, 0, 255), 2) # 赤色の四角で囲む

結果を表示

cv2.imshow(“Original 1”, img1)

cv2.imshow(“Original 2”, img2)

cv2.imshow(“Differences”, diff_display)

cv2.waitKey(0)

cv2.destroyAllWindows()

使用例

find_differences("image1.jpg", "image2.jpg")

実際に試す際は、同じフォルダに比較したい画像を用意し、ファイル名を指定してください。

“`

このコードは、まさに僕の「デジタル探偵」となってくれた。人間が見落とすような微細な痕跡も、冷静沈着に特定し、赤いペンで印をつける。まるで高性能な監視カメラが24時間体制で画像を見比べ続けるようだ。この技術を導入して以来、僕の仕事は劇的に変わった。手動での比較作業はほとんどなくなり、僕はより創造的な設計業務や改善提案に時間を使えるようになった。

もちろん、どんな画像でも完璧に検出できるわけではない。背景の複雑さ、照明条件、微妙な画像のアライメントずれなどが影響することもある。しかし、閾値やノイズ除去のパラメータを調整したり、画像アライメントの技術を組み合わせたりすることで、検出精度は格段に向上する。これは、OpenCVという強力なツールを使いこなすための、次なるステップとなるだろう。

あなたの時間は「間違い探し」に奪われない

僕の体験は、あなたにも当てはまるはずだ。もし今、あなたが「手動での間違い探し」という砂漠で落とした針を探すような徒労感に苛まれているなら、OpenCVはあなたの強力な金属探知機となるだろう。退屈な繰り返し作業はAIに任せ、あなたはもっと本質的で、創造的な仕事に集中すべきだ。それは、あなたの生産性を高めるだけでなく、日々の仕事の質、ひいては人生の質そのものを向上させることに繋がる。

OpenCVは単なるライブラリではない。それは、非効率な現状を打破し、あなたの未来を切り開くための「鍵」なのだ。さあ、あなたもこの「デジタル探偵」を味方につけ、見えない違いをコードで暴き、新たな価値を創造する一歩を踏み出してみないか。もう、あなたの時間は『間違い探し』に奪われない。あなたは、もっと創造的な未来へ進むことができるのだから。