영상처리/OpenCV

이미지 변환 (대칭/회전)

성혜영 2022. 6. 8. 14:05

 

대칭

대칭은 기하학적 측면에서 반사(REFLECTION)의 의미를 가짐. 2차원 유클리드 공간에서의 기하학적인 변환의 하나로 R² (2차원 유클리드 공간) 위의 선형 변환 진행. 대칭은 변환할 행렬(이미지)에 대해 2X2 행렬을 왼쪽 곱셈함. 즉, ‘p’ 형태의 물체에서 Y축 대칭 > ‘q’ 형태

단순히 원본 행렬에서 축에 따라 재매핑을 진행하면 대칭된 행렬을 얻음.

축 대칭 행렬은 2x2 반사 행렬을 왼쪽에 곱해서 얻음.

 

# 대칭 함수

dst = cv2.flip(

    src,

    flipCode

)

 

대칭함수는 입력 이미지(src)의 행과 열을 바꾸기 위해 축을 기준으로 이미지를 반사.

x,y,xy축을 대상으로 이미지를 대칭 시키고, 대칭 축(flipCode)을 사용해 이미지의 대칭 방향을 선택. 카메라의 이미지가 대칭되어 표시될때나 원점 이미지를 서로 변환할 때 사용.

 

대칭 축(flip Code)의 값

  • 음수 : XY축 대칭
  • 0 : X축 대칭
  • 양수 : Y축 대칭
  • 대칭 플래그는 OR(|) 연산 불가



회전(Rotation)

선형 변환 중 하나, 회전 변환 행렬(Rotation matrix)은 임의의 점을 중심으로 물체를 회전.

회전 변환 행렬의 일부는 반사 행렬과 같은 값을 지닐 수 있음.

 

2차원 유클리드 공간에서의 회전

  1. 좌표값을 회전시키는 회전행렬
  2. 좌표축을 회전시키는 회전행렬

 

# 회전 행렬 생성 함수

matrix = cv2.getRotationMatrix2D(

    center,

    angle,

    scale

)

 

2x3 회전 행렬 생성 함수

중심점(center) : 회전의 기준이 될 중심.  회전의 중심점의 원점은 좌측 상단(0,0). 

각도(angle) : 이미지가 회전될 회전각, 도(º) 단위와 반시계 방향을 가짐.

비율(scale) : 회전 후의 이미지의 확대 또는 축소 비율 > 비율 조정값이 없는 경우 1.0

 

# 회전 행렬의 재할당

import math

import cv2



src = cv2.imread("glass.jpg")



height, width, _ = src.shape

center = (width / 2, height / 2)

angle = 90

scale = 0.5

matrix = cv2.getRotationMatrix2D(center, angle, scale)



radians = math.radians(angle)

sin = math.sin(radians)

cos = math.cos(radians)

bound_w = int((height * scale * abs(sin)) + (width * scale * abs(cos)))

bound_h = int((height * scale * abs(cos)) + (width * scale * abs(sin)))



matrix[0, 2] += ((bound_w / 2) - center[0])

matrix[1, 2] += ((bound_h / 2) - center[1])



dst = cv2.warpAffine(src, matrix, (bound_w, bound_h))



cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()




원본 이미지(src)를 Y축으로 대칭한 다음 이미지의 중심점을 기준으로 이미지 비율의 변화 없이 90도 회전한다. 출력이미지(dst)의 이미지 크기를 알맞게 설정하지 않는다면 단순하게 회전을 수행하며 이미지가 누락되거나 불필요한 정보가 반환됨. 이미지를 올바르게 설정하려면 매핑 변환 행렬(matrix)의 값을 수정하고 dst의 크기를 변환 후 값을 조정해야 함. 

 

45도 방향으로 비율을 조정해서 이미지를 회전한다면 사각형 공간에 이미지를 표시하기 때문에 기존 이미지 크기와 큰 차이 발생. > 출력하는 사각형 재생성 필요

 

matrix : angle 값에 따라 계산

bound_w / bound_h : 출력 박스 계산 > cos/sin

affine : 원본 이미지 + matrix로 실제 변환 수행

 

'영상처리 > OpenCV' 카테고리의 다른 글

모폴로지 변환  (0) 2022.06.08
이미지 기하학적 변환 (아핀변환/원근변환)  (0) 2022.06.08
이미지 크기 조절  (0) 2022.06.08
이미지 변환 (확대/축소)  (0) 2022.06.08
각종 흐림효과  (0) 2022.06.08