-
파이썬 OpenCV 이미지 차이 구하기컴퓨터/파이썬 2020. 8. 6. 17:49728x90반응형
OpenCV
할 것
이미지 차이를 구해서 빨간색으로 칠하기
1. OpenCV 설치
pip install opencv-python
2. 이미지 설정
imageA = 원본, imageB = 비교 대상, imageC = 원본 복사
grayA = imageA를 gray scale, grayB = imageB를 gray scale
import cv2 from skimage.measure import compare_ssim imageA = cv2.imread("D:\DEV\Code\Python\img\diff1.jpg") # 원본 imageB = cv2.imread("D:\DEV\Code\Python\img\diff2.jpg") # 비교 imageC = imageA.copy() # 결과물 저장용 tempDiff = cv2.subtract(imageA, imageB) grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY) grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
3. Structural Similarity Index
두 이미지의 차이 %를 구하기 위해서 Mean Squared Error 혹은 SSIM을 사용할 수 있다.
MSE와 SSIM의 차이는, SSIM은 MSE을 방식을 포함하나,
SSIM = 원본 이미지 A와 왜곡된 이미지 B 가 있다고 할 때 SSIM은 두 이미지의 휘도, 대비, 및 구조를 비교한다.
MSE = 원본 이미지와 복원 이미지가 있다면 두 이미지의 픽셀 값들의 차이에 대한 측정값을 나타낸다.
(score, diff) = compare_ssim(grayA, grayB, full=True) diff = (diff * 255).astype("uint8") print(f"Similarity: {score:.5f}") assert score, "다른 점 찾을 수 없음"
# 이 글 예제 Similarity: 0.98386
4. 차이점 mask
(0, 0, 255), thresh에서, 255인 값이면 imageC의 부분을 빨간색으로 바꾼다.
def threshold() =
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] # 차이점 빨간색으로 칠하기 tempDiff[thresh == 255] = [0, 0, 255] imageC[thresh == 255] = [0, 0, 255]
5. 이미지 출력 및 저장
# 다른 점 diff3.png로 저장 cv2.imwrite("D:\DEV\Code\Python\img\diff3.png", imageC) # 결과 출력 cv2.imshow("Original", cv2.resize(imageA, (960, 540))) cv2.imshow("Compare", cv2.resize(imageB, (960, 540))) cv2.imshow("Difference", cv2.resize(imageC, (960, 540))) cv2.imshow("Gray", cv2.resize(diff, (960, 540))) cv2.imshow("Gray2", cv2.resize(tempDiff, (960, 540))) # 아무 키나 눌러서 종료하기 cv2.waitKey(0)
더보기import cv2 from skimage.measure import compare_ssim imageA = cv2.imread("D:\DEV\Code\Python\img\diff1.jpg") imageB = cv2.imread("D:\DEV\Code\Python\img\diff2.jpg") imageC = imageA.copy() tempDiff = cv2.subtract(imageA, imageB) grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY) grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY) cv2.imshow("grayA", cv2.resize(grayA, (960, 540))) (score, diff) = compare_ssim(grayA, grayB, full=True) diff = (diff * 255).astype("uint8") print(f"Similarity: {score:.5f}") assert score, "다른 점 찾을 수 없음" thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] # 차이점 빨간색으로 칠하기 tempDiff[thresh == 255] = [0, 0, 255] imageC[thresh == 255] = [0, 0, 255] # 다른 점 diff3.png로 저장 cv2.imwrite("D:\DEV\Code\Python\img\diff3.png", imageC) # 결과 출력 cv2.imshow("Original", cv2.resize(imageA, (960, 540))) cv2.imshow("Compare", cv2.resize(imageB, (960, 540))) cv2.imshow("Difference", cv2.resize(imageC, (960, 540))) cv2.imshow("Gray", cv2.resize(diff, (960, 540))) cv2.imshow("Gray2", cv2.resize(tempDiff, (960, 540))) # 아무 키나 눌러서 종료하기 cv2.waitKey(0)
Intelligent Test Automation : https://endtest.io/
OpenCV doc : https://opencv-python.readthedocs.io/en/latest/
참고 : https://www.pyimagesearch.com/2014/09/15/python-compare-two-images/
728x90'컴퓨터 > 파이썬' 카테고리의 다른 글
파이썬 정렬 알고리즘 모음 + 속도 테스트 (0) 2020.08.10 파이썬 Smooth Sort (부드러운 정렬 알고리즘) (0) 2020.08.03 파이썬 win10toast 윈도우 알림 만들기 (0) 2020.08.02