ABOUT ME

-

Total
-
  • 파이썬 OpenCV 이미지 차이 구하기
    컴퓨터/파이썬 2020. 8. 6. 17:49
    728x90
    반응형

    OpenCV

     

    OpenCV

    About the author:Pau Rodríguez is a research scientist at Element AI, Montreal. He earned his Ph.D.

    opencv.org

     

     

    할 것

    이미지 차이를 구해서 빨간색으로 칠하기

    1. OpenCV 설치

    pip install opencv-python

     

    2.  이미지 설정

    imageA = 원본, imageB = 비교 대상, imageC = 원본 복사

    grayA = imageA를 gray scale, grayB = imageB를 gray scale

    cvtColor 문서

    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() =

    https://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html?highlight=threshold#cv2.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. 이미지 출력 및 저장

    imshow 문서

    # 다른 점 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

    댓글