# 영상의 변환
- 구성하는 픽셀의 배치 구조를 변경함으로 전체 영상의 모양을 바꾸는 작업
이미지 이동(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로 읽어버리고 그런식으로 활용할 수 있습니다.
'AI 컴퓨터 비전프로젝트' 카테고리의 다른 글
[DL] 엣지검출(Canny) , 필터캠 (0) | 2024.10.07 |
---|---|
[DL] 투시변환(persective), 명함을 이용한 사진 활용 (5) | 2024.10.06 |
[DL] 적응형이진화(cv2.adaptiveThreshold())+자동이진화 적응형, 가우시안 비교 (0) | 2024.10.04 |
[DL] 오츠의 이진화(스레숄드값을 자동으로 잡아주기) (0) | 2024.10.03 |
[DL]영상의 이진화(Binarization) (0) | 2024.10.02 |