본문 바로가기

etc/FastCampus 챌린지

[패스트캠퍼스 수강 후기] 컴퓨터비전인강 100% 환급 챌린지 49 회차

728x90
반응형

영상의 전단 변환 - Shear transformation

전단 변환

 

 영상의 전단 변환은 층 밀림 변환이라고도 합니다.

 

 이동을 하는데 모든 픽셀들이 동일하게 이동하는 것이 아니라 어떤 픽셀은 조금 이동하고 어떤 픽셀은 많이 이동하여 한쪽을 찌그러뜨리는 효과를 냅니다.

 

 

 전단 변환도 이동 변환과 마찬가지로 어파인 행렬을 만들어야 합니다.

 

 이동 변환에서는 단위 행렬을 어파인 행렬로 생성했지만, 전단 변환은 m 상수도 필요합니다.

 

 

 전단 변환을 한 만큼 영상이 밀려나가게 되어 영상이 짤립니다.

 

 이를 해결하기 위해 밀린 만큼 출력 영상의 크기를 키워주면 됩니다.

 

영상의 어파인 변환 함수 - cv2.warpAffine

 이동 변환과 동일한 함수를 이용합니다. 차이점은 어파인 행렬의 값이 다릅니다.

 

함수 설명

cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst

• src: 입력 영상
• M: 2x3 어파인 변환 행렬. 실수형.
• dsize: 결과 영상 크기. (w, h) 튜플. (0, 0)이면 src와 같은 크기로 설정.
• dst: 출력 영상
• flags: 보간법. 기본값은 cv2.INTER_LINEAR.
• borderMode: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT. 
• borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0(검정색).

 cv2.INTER_LINEAR은 양선형 보간법을 의미합니다.

 borderValue는 이동 변환을 했을 때 생기는 빈공간을 어떤 색깔로 채울 것인지를 의미합니다. 기본값은 0(껌정색)입니다.

 

전단 변환 예제

 

src = cv2.imread('tekapo.bmp')

if src is None:
    print('Image load failed!')
    sys.exit()

# 어파인 행렬 생성
aff = np.array([[1, 0.5, 0],
                [0, 1, 0]], dtype=np.float32)

# 입력 영상의 크기 추출
h, w = src.shape[:2]

# 입력 영상과 출력 영상의 크기가 동일하다면 영상이 밀린 만큼 짤리게 되므로
# 출력 영상의 크기를 키워줬습니다.
# int를 이용한 경우는 입력값은 실수여야 합니다. 혹시 정수값이 입력될 수 있으므로 int를 이용했습니다.
dst = cv2.warpAffine(src, aff, (w + int(h * 0.5), h))

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

 

입력 영상

 

전단 변환

 

영상의 기하학적 변환(geometric transformation)이란?

 영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상의 모양을 바꾸는 작업입니다.

 

 영상의 모양 자체를 변환하고 좌표에 대한 개념이 필요합니다.

 

 기하학적 변환이 필요한 이유

 

1. 입력 영상 크기가 제한되어 있어 영상 크기를 축소해야 하는 경우.

2. 객체가 영상의 정중앙에 있어야 하는 경우.

3. 회전이 되어 있는 영상을 똑바로 보정

 

 이 외에도 여러가지 상황에서 영상의 기하학적 변환이 필요합니다.

 

1. 영상의 이동 변환 - Translation transformation

 

 이동 변환은 shift라는 용어도 많이 씁니다.

 

 가로 또는 세로 방향으로 영상을 특정 크기만큼 이동시키는 변환입니다.

 

 x, y 방향으로 어느 정도 이동했는지에 대한 변위를 지정해줘야 합니다.

 

 원점에서 x축 이동은 a, y축 이동은 b로 표시합니다.

 

 덧셈 행렬로 구성되어 있는데, 곱셈 행렬 형태로 변환하여 하나의 수식으로 표현할 수 있습니다.

 

 

 어파인 변환 행렬(동차적 표계 개념)을 적용하면 이동 변환을 하나의 행렬로 표현할 수 있습니다.

 

 이동 변환을 표현하는 어파인 변환 행렬을 np.array로 만들고 cv2.warpAffine 함수로 넘겨주면 이동 변환 할 수 있습니다.

 

2. 영상의 어파인 변환 함수 - cv2.warpAffine

 어파인 변환 행렬을 어파인 변환 함수에 입력해주면 이동 변환을 할 수 있습니다.

 

함수 설명

cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst

• src: 입력 영상
• M: 2x3 어파인 변환 행렬. 실수형.
• dsize: 결과 영상 크기. (w, h) 튜플. (0, 0)이면 src와 같은 크기로 설정.
• dst: 출력 영상
• flags: 보간법. 기본값은 cv2.INTER_LINEAR.
• borderMode: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
• borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0(검정색).

 cv2.INTER_LINEAR은 양선형 보간법을 의미합니다.

 borderValue는 이동 변환을 했을 때 생기는 빈공간을 어떤 색깔로 채울 것인지를 의미합니다. 기본값은 0(껌정색)입니다.

 

이동 변환 예제

src = cv2.imread('tekapo.bmp')

if src is None:
    print('Image load failed!')
    sys.exit()

# 어파인 변환 행렬 생성
aff = np.array([[1, 0.5, 0],
                [0, 1, 0]], dtype=np.float32)
                
dst = cv2.warpAffine(src, aff, (0, 0)) # 0,0 의미는 입력영상 크기와 동일한 출력 영상 생성

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

 

 

 

영상의 이동 변환

 

 입력 영상과 동일한 크기로 출력 영상을 출력했으므로 영상이 짤렸습니다.

 짤린 부분까지 출력하고 싶다면 출력 영상의 크기를 크게 해야합니다.

728x90
반응형