※GIMPを使用した手作業、人力の方が、精度が高い。
未完成のプログラム。この方法は普段は不使用。
実験的な内容になる。
画像一枚を指定するのと、フォルダを指定するのだと、結果が異なった。
精度としては、画像の一枚の方が高い。
画像の幅と高さが大きいと、思うような結果が出ない。
Google Colab AIを使用して、
二つの画像の差分を検出して切り取り、もう片方の画像に貼り付けるプログラムを作成して貰った。
中国語のコメントは、プログラムの生成と共に作られた。そのコメントの右の文章は、DeepLで翻訳して貰った。
無修正版と修正有り版の画像の幅と高さを合わせて、枚数も合わせて、ズレが無いことが前提となる。
読み込む画像の拡張子については、".jpg"にしてある。出力も".jpg"になる。
ファイル名は2桁のゼロ埋めで、"00"から始まる。
画像が出力されるフォルダは、anacondaの環境なら、パイソンのプログラムファイルが有るフォルダに出力される。
Google Colab AIへの指示文を、以下に示す。
「pythonを使用して、二つの画像の差分を複数、検出して、切り取って、もう片方の画像に貼り付けるプログラムを作成して下さい。」
【環境】
Google Colab AI
Anaconda3
Jupyter Notebook
【使い方】
img1 = cv2.imread(path1)の「path1」の所に、無修正(海外版)のフォルダのダブルコーテーション有りのパスを入れる。
img2 = cv2.imread(path2)の「path2」の所に、修正有り(日本語版)のフォルダのダブルコーテーション有りのパスを入れる。
エラーが出る場合は、パスの前に「R」か「r」を打つ。
以下に例を示す。
#具体例
image_list1 = glob.glob(r"C:\Users\user\Desktop\kaigaiban1\*.jpg")
image_list2 = glob.glob(r"C:\Users\user\Desktop\kaigaiban2\*.jpg")
以下に、プログラムを示す。
import cv2
import numpy as np
import glob
#2
image_list1 = glob.glob(path1)
image_list2 = glob.glob(path2)
#全てのファイル数を取得
maxc = len(image_list1)
for i in range(maxc):
#配列の画像を読み込み
img1 = cv2.imread(image_list1[i])
img2 = cv2.imread(image_list2[i])
#画像をグレースケールに変換する
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
#2つの画像の差の絶対値を計算する
diff = cv2.absdiff(gray1, gray2)
#差分画像の閾値処理
thresh = cv2.threshold(diff, 10, 255, cv2.THRESH_BINARY)[1]
#閾値処理された画像に対してモルフォロジー演算を行う
kernel = np.ones((5,5),np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
#閾値処理された画像から輪郭を見つける
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#アウトラインの横断
for contour in contours:
#アウトラインのバウンディングボックスを取得
x, y, w, h = cv2.boundingRect(contour)
#アウトラインが十分な大きさであれば、それをカットして別の画像に貼り付けます。
if w > 5 and h > 5:
diff_region = img1[y:y+h, x:x+w]
img2[y:y+h, x:x+w] = diff_region
#差分を別の画像に貼り付ける
cv2.imwrite('{0:02d}'.format(i)+'.jpg',img2)
# 显示结果图像
cv2.imshow('Result', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()