opencv-python 이미지 배합(일치 와 중첩)의 실현

이미지 배합 은 서로 다른 조건 에서 얻 은 두 폭 또는 여러 폭 의 그림 을 일치 시 키 고 중첩 하 는 과정 을 말한다.가장 간단 한 방법 은 원 이미지 에서 목표 이미지 사이 의 투시 변환 행렬 을 구하 고 원 이미 지 를 행렬 에 따라 변환 하면 목표 이미지 와 비슷 한 효 과 를 얻 을 수 있다.투시 변환 은 이미 지 를 새로운 시각 평면 에 투영 하 는 것 으로 투영 맵 이 라 고도 부른다.

투시 변환 은 실질 적 으로 2 차원 의 그림 을 3 차원 의 좌표계 로 바 꾼 다음 에 다른 2 차원 좌표계 로 바 꾸 는 것 으로 모방 변환 에 비해 투시 변환 이 실현 되 는 효과 가 많다.정확 한 행렬 과 투시 변환 은 opencv-python 에서 쉽게 이 루어 질 수 있다.

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
original_image = cv.imread("Image A.jpg")
target_image = cv.imread("Image B.jpg")
#       
src_points = np.array([[957, 1655], [2177, 1170], [2676, 24], [2487, 1931]], dtype=np.float32)
den_points = np.array([[687, 1150], [2000, 996], [2757, 18], [2098, 1819]], dtype=np.float32)
# getPerspectiveTransform       src_points   den_points       
T = cv.getPerspectiveTransform(src_points, den_points)
#       
#                    ,   (  ,  )
warp_imgae = cv.warpPerspective(original_image, T, (target_image.shape[1], target_image.shape[0]))
plt.imshow(warp_imgae)
plt.show()
4 시 변환 전후 결 과 는?

opencv-python 도 네 개의 점 을 초과 한 두 개의 그룹 점 간 의 변환 행렬 을 계산 할 수 있다.원 이미지 에 7 개의 점 을 선택 하여 투시 변환 한 결 과 는?

#           
src_more_point = np.float32([[957, 1655], [2177, 1170], [620, 2586], [1280, 2316], [2487, 1931], [937, 758], [2676, 24]]).reshape(-1, 1, 2)
den_more_point = np.float32([[687, 1150], [2000, 996], [121, 1974], [927, 1886], [2098, 1819], [899, 280], [2757, 18]]).reshape(-1, 1, 2)
#            
# cv.findHomography                 ,0     ,cv.RANSAC   RANSAC     ,cv.LMEDS     
#     ,cv.RHO  PROSAC     .          1 10,        。                   
#     .    H     .mask   ,    .
H, status = cv.findHomography(src_more_point, den_more_point, cv.RANSAC, 5.0)
#       
warped_more_point_image = cv.warpPerspective(original_image, H, (target_image.shape[1], target_image.shape[0]))
4 개의 점,7 개의 점 과 opencv-python 함수 라 이브 러 리 가 자동 으로 일치 하 는 효 과 를 다음 과 같이 비교 합 니 다.

일치 점 을 적절하게 선택 하면 세 가지 방법의 효 과 는 크게 다 르 지 않다 는 것 을 알 수 있다.
라 이브 러 리 함수 의 그림 자동 일치 코드 는 다음 과 같 습 니 다.

#  AKAZE           ,AKAZE SIFT           ,       
akaze = cv.AKAZE_create()
# Find the keypoints and descriptors with SIFT
kp1, des1 = akaze.detectAndCompute(original_image_gray, None)
kp2, des2 = akaze.detectAndCompute(target_image_gray, None)

bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append([m])

#              
img3 = cv.drawMatchesKnn(original_image_gray, kp1, target_image_gray, kp2, good_matches, None, flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)


src_automatic_points = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
den_automatic_points = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

#            
H, status = cv.findHomography(src_more_point, den_more_point, cv.RANSAC, 5.0)
#       
warped_automatic_image = cv.warpPerspective(original_image, H, (target_image.shape[1], target_image.shape[0]))

#     
my_draw(warped_automatic_image, tip='automatic')
opencv-python 이미지 배합 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 opencv-python 이미지 배합 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기