Skip to content

Image Comparison

이미지 비교와 관련된 내용.

Comparing Two Images in GUI Applications

두 장의 이미지를 비교하여 GUI로 출력할 때 가독성과 효율성을 높이는 방법을 추천합니다.

비교 목적(차이점 분석, 유사도 검사 등)에 따라 다양한 방식이 있지만, 대표적인 방법은 다음과 같습니다.

Side-by-Side Comparison (좌우 또는 상하 비교)

  • 방식: 두 이미지를 나란히 배치합니다. 좌우 또는 상하로 정렬하여 사용자가 차이점을 직접 시각적으로 비교합니다.
  • 장점: 가장 직관적이며, 변경된 부분을 직접 확인하기 쉽습니다.
  • 구현 방법: OpenCV, PyQt, Tkinter 등으로 두 이미지를 캔버스에 배치합니다.
  • 추가 기능:
    • 슬라이더를 사용해 한쪽 이미지를 투명하게 조정하거나, 특정 영역을 확대합니다.
    • 마우스를 이용해 이미지 간 위치를 동기화하여 같은 지점을 동시에 비교합니다.
import cv2
import numpy as np
from tkinter import *
from PIL import Image, ImageTk

# 이미지 불러오기
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 크기 조정 (동일 크기로)
img1 = cv2.resize(img1, (600, 400))
img2 = cv2.resize(img2, (600, 400))

# GUI 설정
root = Tk()
root.title("Image Comparison")

# 이미지 변환
img1_tk = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)))
img2_tk = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)))

# 라벨 배치
Label(root, image=img1_tk).grid(row=0, column=0)
Label(root, image=img2_tk).grid(row=0, column=1)

root.mainloop()

Difference Overlay (차이 오버레이)

  • 방식: 두 이미지를 픽셀 단위로 비교하여 차이를 강조합니다. 차이 부분을 색상(빨간색 등)으로 표시해 두 이미지의 차이점을 명확하게 드러냅니다.
  • 장점: 빠르게 차이점을 확인할 수 있으며, 미세한 변경 사항을 효과적으로 검출합니다.
  • 구현 방법: cv2.absdiff() 또는 cv2.subtract()를 사용해 이미지의 차이를 계산합니다.
  • 추가 기능:
    • 특정 임계값 이상만 차이로 간주하고 노이즈는 제거합니다.
    • 차이 부분에 라벨 또는 테두리를 추가합니다.
diff = cv2.absdiff(img1, img2)
gray_diff = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray_diff, 30, 255, cv2.THRESH_BINARY)

# 차이 부분 강조
highlight = cv2.addWeighted(img1, 0.6, img2, 0.6, 0)
highlight[thresh > 0] = (0, 0, 255)

cv2.imshow("Difference Highlight", highlight)
cv2.waitKey(0)
cv2.destroyAllWindows()

Slider Blending (슬라이더 블렌딩)

  • 방식: 슬라이더를 움직여 두 이미지 간 투명도를 조절하며 비교합니다. 슬라이더를 한쪽으로 당기면 한 이미지가 점진적으로 다른 이미지로 전환됩니다.
  • 장점: 실시간으로 차이를 확인할 수 있으며, 사용자가 원하는 부분을 직접 확인 가능합니다.
  • 구현 방법: OpenCV와 Tkinter 또는 PyQt로 슬라이더를 구현해 이미지의 가중치를 조절합니다.
def update(val):
    alpha = val / 100
    blended = cv2.addWeighted(img1, alpha, img2, 1 - alpha, 0)
    cv2.imshow('Blended Image', blended)

cv2.namedWindow('Blended Image')
cv2.createTrackbar('Blend', 'Blended Image', 0, 100, update)
update(0)
cv2.waitKey(0)
cv2.destroyAllWindows()

Blinking (깜박이기)

  • 방식: 두 이미지를 번갈아가며 깜박이는 방식으로 출력합니다.
  • 장점: 미세한 차이가 즉시 드러나며, 두 이미지가 거의 유사할 때 효과적입니다.
  • 구현 방법: 타이머를 사용해 이미지를 일정 간격으로 바꿉니다.
while True:
    cv2.imshow('Comparison', img1)
    cv2.waitKey(500)  # 500ms 후 전환
    cv2.imshow('Comparison', img2)
    cv2.waitKey(500)

Swipe Line (스와이프 라인)

  • 방식: 마우스 드래그 또는 슬라이더로 한 이미지를 부분적으로 가려 두 이미지의 동일한 영역을 비교합니다.
  • 장점: 같은 영역을 직접 확인하면서 정확한 비교가 가능합니다.
  • 구현 방법: 슬라이더 또는 마우스 이벤트를 감지하여 한쪽 이미지를 잘라서 보여줍니다.
def swipe(val):
    x = val
    swipe_img = img2.copy()
    swipe_img[:, :x] = img1[:, :x]
    cv2.imshow('Swipe Comparison', swipe_img)

cv2.namedWindow('Swipe Comparison')
cv2.createTrackbar('Swipe', 'Swipe Comparison', 0, img1.shape[1], swipe)
swipe(0)
cv2.waitKey(0)
cv2.destroyAllWindows()

결론

  • 간단한 비교는 Side-by-Side 방식이 적합합니다.
  • 차이 분석은 Difference Overlay 방식이 가장 효과적입니다.
  • 직관적인 조작이 필요하면 Slider Blending이나 Swipe Line 방식이 추천됩니다.

See also

Favorite site