OpenCV에 의한 매우 간단한 실수 찾기

5034 단어 파이썬OpenCV
아는 사람이 이미지의 차이를 비교하는 프로그램이 필요하다고 말했기 때문에 Python과 OpenCV에서 짜 보았다. 요점은 OpenCV를 이용한 실수 찾기이지만, 이미지끼리 일체의 어긋남이 없는 것이 조건이 되기 때문에, 실무적인 아레에는 적합하지 않을지도 모른다. 보다 강건한 실수 찾기가 필요한 분은 이 기사 등을 참고로 하는 것이 좋을지도. 구현은 이 기사의 방법이 10배 정도 가볍다고 생각하지만…

결과



다음과 같은 이미지가 출력됩니다.


(이미지는 Wikipedia 보다 인용)

소스 코드


import cv2
import matplotlib.pyplot as plt

img1 = cv2.imread('img1.png')
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
img1 = img1/255
img2 = cv2.imread('img2.png')
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
img2 = img2/255
dif = cv2.absdiff(img1,img2)
dif[dif>0] = 1

fig,axs = plt.subplots(2,2)
ar = axs.ravel()
ar[0].imshow(img1)
ar[1].imshow(img2)
ar[2].imshow(img1*dif*0.8 + img1*0.2)
ar[3].imshow(img2*dif*0.8 + img2*0.2)
plt.show()

본질적인 처리는 OpenCV에 의한 수행으로 끝나지만 matplotlib로 표시하기 위한 하처리에서 꽤 행수가 걸려 있다. 요점은 cv2.absdiff 로 차분 화상을 취할 수 있으므로, 그것을 마스크로서 이용하고 있다. diff 그대로라면 RGB 채널 각각에 대해 차분을 취하고 있으므로, dif[dif>0] = 1 라고 하는 조작에 의해 마스크로 한다.

생각보다도 번거로운 점으로서는, OpenCV의 화상 데이터는 int 형과 float 형의 양쪽 모두 취할 수 있게 되어 있어, 평상시는 편리하지만 이번은 그 탓으로 마스크가 능숙하지 않았다. 결과, 이미지를 로드한 시점에서 /255 하고 강제로 float 로 캐스팅하고 있다.

좋은 웹페이지 즐겨찾기