본문 바로가기
AI 컴퓨터 비전프로젝트

[DL] 영상의 변환(이동), resize

by 바다의 공간 2024. 10. 5.

# 영상의 변환
- 구성하는 픽셀의 배치 구조를 변경함으로 전체 영상의 모양을 바꾸는 작업

이미지 이동(translate)하는 방법 

애니메이션처럼이동하는것이 아니라 위치에서 살짝 이동하는 방식을 이야기함!

 

이미지를 이동할때는 변환행렬을 사용합니다. 


변환행렬의 형태         [결과] 
    M = | 1 0 a |     x방향으로 a만큼
           | 0 1 b |        y방향으로 b만큼

 

실행시켜주는 함수 :  cv2.warpaffine(영상, affine행렬, (0,0))
(0,0)을 넣으면 입력 영상과 크기가 같은(=똑같은) 행렬을 반환합니다.

 

이 함수를 사용하게되면 변환행렬을 가지고 영상에 적용시켜주는 함수입니다.

 

예제는 아래와 같습니다.

이 사진을 사용할겁니다.

 

import cv2
import numpy as np

img = cv2.imread('./dog.bmp')

#변환행렬 만들기
aff = np.array([[1,0,200], [0,1,100]], dtype=np.float32)
dst= cv2.warpAffine(img, aff, (0,0))

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()

1, 0  x축으로 가고싶은 100

0, 1 y축으로 가고싶은 100

이렇게 이미지가 옆으로 이동된 변환된것입니다.

모든것이 되는건아니고 변환이 필요한 영상들이 있고(예를들어 이동, 각도를 돌리는건 필요없음),

전처리할때 유용하게 쓰일 수 있습니다.


## resize (중요)

크기변환(resize)
영상의 크기를 원본 영상보다 크게 또는 작게 만드는 변환

찌그러지거나 짤리는것을 방지하기 위해 사용하는 알고리즘입니다.


cv2.resize(영상, 크기, 보간법)
    보간법 알고리즘 

interpolation()


    cv2.INTER_LINEAR: 인접한 4개의 픽셀 값에 거리 가중치를 사용(속도는 빠르지만 퀄리티가 조금 떨어짐)
    cv2.INTER_NEAREST: 가장 가까운 픽셀 값을 사용(속도는 가장 빠르지만 퀄리티가 조금 떨어짐)
    cv2.INTER_CUBIC : 인접한 16개의 픽셀 값에 가중치를 사용( 퀄리티는 가장 높지만 속도가 떨어짐)
    CV2.INTER_AREA: 픽셀 영역 관계를 이용한 재샘플링(영역적인 정보를 추출해서 영상을 다시 세팅하기 때문에 다운 샘플링시 효과적입니다)

import cv2

img= cv2.imread('./dog.bmp')
dst1 = cv2.resize(img,(1280, 1024), interpolation=cv2.INTER_NEAREST)
dst2 = cv2.resize(img,(1280, 1024), interpolation=cv2.INTER_CUBIC)
#결과 :  큐빅을 사용하지 않아도 된다는 결과

cv2.imshow('img', img)
cv2.imshow('dst1', dst1[200:500, 200:500])
cv2.imshow('dst2', dst2[200:500, 200:500])
cv2.waitKey()

 

여기서 보면 dst1, dst2 크기를 확 느렸을때의 차이점은 분명히 존재한다고 볼 수 있습니다.

 

좀 더 가까이 확대해서 보기 위해서 dst1의 일부만 떼어가지고 옵니다.

cv2.imshow('dst1', dst1[200:500, 200:500])
cv2.imshow('dst2', dst2[200:500, 200:500])

 

이 부분입니다.

 


 

회전(rotation)
영상을 특정 각도만큼 회전시키는 변환(반시계 방향, 음수는 시계방향)
    cv2.getRotaionMatrix2D(중심좌표, 회전각도, 확대비율)

여기에 영상을 직접넣지 않습니다. 이유는  affine행렬이 자동생성되기때문입니다.

그래서 그 뒤에 wrapAffine으로 넣어줍니다.
    cv2.warpAffine(영상, affine행렬, (0,0))

 

import cv2

img = cv2.imread('./dog.bmp')
#회전시키기 위한 가운데의 값을 구하기
#center point = cp
cp =(img.shape[1] /2, img.shape[0]/2)

#회전시키기
rot = cv2.getRotationMatrix2D(cp, 30, 0.7)
dst = cv2.warpAffine(img, rot, (0,0))

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()

번호판을 캡쳐해서 번호판을 ROTATION 을 시키고 전처리시키고 뿌옇게 보이고 이런거 밝게만들고 

OCR로 읽어버리고 그런식으로 활용할 수 있습니다.