728x90
반응형
SMALL
1. 이미지 유사도
- 픽셀값의 분포가 서로 비슷하다면 유사한 이미지일 확률이 높음
- cv2.compareHist(히스토그램1, 히스토그램2, 알고리즘)
- 알고리즘
- cv2.HISTCMP_CORREL: 상관관계(1:완전 일치. -1:완전 불일치, 0: 무관계)
- cv2.HISTCMP_CHISQR: 카이제곱(0:완전 일치, 무한대: 완전 불일치)
- cv2.HISTCMP_INTERSECT: 교차(1:완전 일치, 0:완전 불일치)
- cv2.HISTCMP_BHATTACHARYYA: 밀도함수(0: 완전 일치, 1: 완전 불일치)
✅ img1과 유사도 판단
import cv2
import matplotlib.pyplot as plt
import numpy as np
img1 = cv2.imread('taekwonv1.jpg')
img2 = cv2.imread('taekwonv2.jpg')
img3 = cv2.imread('taekwonv3.jpg')
# img4 = cv2.imread('taekwon_v.jpg')
img4 = cv2.imread('dr_ochanomizu.jpg')
cv2.imshow('img1', img1)
imgs = [img1, img2, img3, img4]
hists = []
for i, img in enumerate(imgs):
plt.subplot(1, len(imgs), i+1)
plt.title('img%d' %(i+1))
plt.axis('off')
plt.imshow(img[:, :, ::-1]) # BGR -> RGB
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 0번(h)은 0 ~ 180 사이, 1번(s)은 0 ~ 255 사이
hist = cv2.calcHist([hsv], [0,1], None, [180, 256], [0, 180, 0, 256])
cv2.normalize(hist, hist, 0, 1, cv2.NORM_MINMAX)
hists.append(hist)
# print(hists[0])
query = hists[0]
methods = {'CORREL': cv2.HISTCMP_CORREL, 'CHISQR':cv2.HISTCMP_CHISQR,
'INTERSECT':cv2.HISTCMP_INTERSECT, 'BHATTACHARYYA':cv2.HISTCMP_BHATTACHARYYA}
for j, (name, flag) in enumerate(methods.items()):
print('%-10s' % name, end='\t')
for i, (hist, img) in enumerate(zip(hists, imgs)):
ret = cv2.compareHist(query, hist, flag)
if flag == cv2.HISTCMP_INTERSECT: # 교차 분석일 경우에만 변경
ret = ret / np.sum(query) # 1미만의 수로 정규화
print('img%d:%7.2f' % (i+1, ret), end='\t')
print()
plt.show()
728x90
반응형
LIST
'Python > Computer Vision' 카테고리의 다른 글
[파이썬, Python] OpenCV - 영상의 필터링, 블러링, 엣지(Edge)검출 (1) | 2023.09.01 |
---|---|
[파이썬, Python] OpenCV - 영상의 변환 (0) | 2023.08.29 |
[파이썬, Python] OpenCV - 영상의 이진화 (0) | 2023.08.27 |
[파이썬, Python] OpenCV - 관심영역(ROI) (0) | 2023.08.25 |
[파이썬, Python] OpenCV - 크로마키(cromakey) (0) | 2023.08.25 |