-
[컴퓨터비전] 두 이미지의 유사성을 측정하는 "SSIM"Computer Vision & AI/Computer Vision 2023. 10. 31. 20:27
- 사용 모듈
OpenCV
PyQt
scikit-image
scikit-image의 compare_ssim함수를 이용하여 두 이미지의 유사도를 측정한다.
0에 가까울수록 유사성이 낮고, 1에 가까울수록 두 이미지간의 유사도가 높다.
- 결과
AI 생성 이미지(오른쪽)들과 비교해봤다.
비교적 높은 수치가 나온 새와 강아지 이미지는 색상이 전체적으로 비슷한 편이나
고흐의 해바라기의 경우 생성 이미지에 방울토마토(R)과 Y값도 크기가 다르게 보인다.
그래서 수치가 낮게 나온 것 같다.
- 전체코드
import sys import cv2 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout, QFileDialog from PyQt5.QtGui import QPixmap from skimage.metrics import structural_similarity as compare_ssim class ImageSSIMCalculator(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('Image SSIM Calculator') self.setGeometry(100, 100, 400, 200) self.label1 = QLabel('Image 1:') self.label2 = QLabel('Image 2:') self.result_label = QLabel('') self.button1 = QPushButton('Load Image 1') self.button2 = QPushButton('Load Image 2') self.calculate_button = QPushButton('Calculate SSIM') self.image1 = None self.image2 = None self.button1.clicked.connect(self.load_image1) self.button2.clicked.connect(self.load_image2) self.calculate_button.clicked.connect(self.calculate_ssim) layout = QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.button1) layout.addWidget(self.label2) layout.addWidget(self.button2) layout.addWidget(self.calculate_button) layout.addWidget(self.result_label) self.setLayout(layout) def load_image1(self): options = QFileDialog.Options() options |= QFileDialog.ReadOnly file_name, _ = QFileDialog.getOpenFileName(self, 'Open Image 1', '', 'Images (*.png *.jpg *.jpeg *.bmp *.gif *.tiff *.tif *.webp)', options=options) if file_name: self.image1 = cv2.imread(file_name, cv2.IMREAD_GRAYSCALE) self.label1.setText(f'Image 1: {file_name}') def load_image2(self): options = QFileDialog.Options() options |= QFileDialog.ReadOnly file_name, _ = QFileDialog.getOpenFileName(self, 'Open Image 2', '', 'Images (*.png *.jpg *.jpeg *.bmp *.gif *.tiff *.tif *.webp)', options=options) if file_name: self.image2 = cv2.imread(file_name, cv2.IMREAD_GRAYSCALE) self.label2.setText(f'Image 2: {file_name}') def calculate_ssim(self): if self.image1 is not None and self.image2 is not None: ## if self.image1.shape != self.image2.shape: # 이미지 크기를 동일하게 만듭니다. self.image1 = cv2.resize(self.image1, (self.image2.shape[1], self.image2.shape[0])) ssim_score = compare_ssim(self.image1, self.image2) self.result_label.setText(f'SSIM Score: {ssim_score:.2f}') else: self.result_label.setText('Please load both images first.') if __name__ == '__main__': app = QApplication(sys.argv) window = ImageSSIMCalculator() window.show() sys.exit(app.exec_())
'Computer Vision & AI > Computer Vision' 카테고리의 다른 글
[Semantic Segmentation] FCN (1) 2024.02.10 재활용 쓰레기 분류를 위한 Object Detection 대회 회고 (0) 2024.01.23 classifier prediction을 할 수 있는 웹사이트 (0) 2023.10.17 SAM - Segment Anything Model (1) 2023.10.17 [TIL] CS231n 3강 - Loss function, Optimization (0) 2023.08.03