카테고리 없음

opencv) 다른 이미지 부분 추출하기

STUFIT 2024. 10. 10. 14:10
반응형

원본 이미지 파일이 있을 때, 다른 특이점이 있는 사진을 비교군으로 해서 비교했을 때, 만약 comapre 부분이 1 이면 동일한 사진으로 사진이 저장되지 않고, 1 이하이면 다른 부분이 존재하므로 다른 부분에 대해서 파란색 직사각형으로 네모칸을 생성해서 표기하도록 한다.

 

pip install opencv-python
pip install scikit-image

두가지 패키지를 설치해준 후에 아래와 같은 코드를 작성하면 test3.jpg가 생성된다.

import cv2
from skimage.metrics import structural_similarity as compare_ssim

ORIGINAL_IMAGE_PATH = "/Users/stufit/Desktop/stufitfolder/개발용폴더/practice1/test2.jpg"
COMPARISON_IMAGE_PATH = "/Users/stufit/Desktop/stufitfolder/개발용폴더/practice1/test4.jpg"
RESULT_IMAGE_PATH = "/Users/stufit/Desktop/stufitfolder/개발용폴더/practice1/test3.jpg"
OUTPUT_COLOR = (255, 0, 0)  # 파란색 테두리


def convert_to_gray(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)


def save_comparison_result(original_image, comparison_image, result_path, result_image):
    grayA = convert_to_gray(original_image)
    grayB = convert_to_gray(comparison_image)

    (score, diff) = compare_ssim(grayA, grayB, full=True)
    print(f"Image similarity: {score}")

    if score == 1.0:
        print("같습니다.")
    else:
        print("틀린부분이 있습니다.")
        diff = (diff * 255).astype("uint8")
        thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
        contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        for contour in contours:
            (x, y, w, h) = cv2.boundingRect(contour)
            cv2.rectangle(result_image, (x, y), (x + w, y + h), OUTPUT_COLOR, 2)

        cv2.imwrite(result_path, result_image)
        print(f"Result saved as {result_path}")


original_image = cv2.imread(ORIGINAL_IMAGE_PATH)
comparison_image = cv2.imread(COMPARISON_IMAGE_PATH)
result_image = comparison_image.copy()

save_comparison_result(original_image, comparison_image, RESULT_IMAGE_PATH, result_image)
반응형