ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터비전] 두 이미지의 유사성을 측정하는 "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_())

    댓글

Designed by Tistory.