OpenCV : 전문가 / PIL은 일반인 대상으로 간편
Affine Transformations
- 강체변환(Ridid-Body) : 크기 및 각도가 보존(ex; Translation, Rotation)
- 유사변환(Similarity) : 크기는 변하고 각도는 보존(ex; Scaling)
- 선형변환(Linear) : Vector 공간에서의 이동. 이동변환은 제외.
- Affine : 선형변환과 이동변환까지 포함. 선의 수평성은 유지.(ex;사각형->평행사변형)
- Perspective : Affine변환에 수평성도 유지되지 않음. 원근변환
Scaling
cv2.resize(img, dsize, fx, fy, interpolation)
img2 = cv2.resize(img, None, fx=0.5, fy=1, interpolation=cv2.INTER_AREA)
- img: 리사이징을 할 이미지 원본
- None: dsize를 나타내는 튜플 값으로 (가로방향 픽셀수, 세로방향 픽셀수)로 나타냅니다. 우리의 예제는 None으로 설정
- fx, fy: 각각 가로 방향, 세로 방향으로 배율 인자. 0.5로 지정하면 원래 크기의 0.5로 리사이징 하라는 의미임
- interplolation: 리사이징을 수행할 때 적용할 interpolation 방법
-
- INTER_NEAREST: nearest-neighbor interpolation
- INTER_LINEAR: bilinear interpolation (디폴트 값)
- INTER_AREA: 픽셀 영역 관계를 이용한 resampling 방법으로 이미지 축소에 있어 선호되는 방법. 이미지를 확대하는 경우에는 INTER_NEAREST와 비슷한 효과를 보임
- INTER_CUBIC: 4x4 픽셀에 적용되는 bicubic interpolation
- INTER_LANCZOS4 : 8x8 픽셀에 적용되는 Lanczos interpolation
interpolation을 할 때 리사이징에 따라 다른 방법을 적용하는 것이 좋습니다.
일반적으로 이미지를 축소하는 경우에는 cv2.INTER_AREA, 이미지를 확대하는 경우에는
cv2.INTER_CUBIC+cv2.INTER_LINEAR를 사용합니다.
Translation
cv2.warpAffine(src, M, dsize)
M = np.float32([
[1, 0, 100],
[0, 1, 50]])
img2 = cv2.warpAffine(img, M, (w, h))
- img: 변환할 소스 이미지
- M: 2 x 3 변환 매트릭스. 1,0,0,1은 고정
- (w, h): 출력될 이미지 사이즈 (tuple)
Rotation
cv2.getRotationMatrix2D(center, angle, scale)
#원본이미지 무게중심을 회전 중심으로 하고 45도 회전
h, w = img.shape[:2]
M = cv2.getRotationMatrix2D((w/2, h/2), 45, 1)
img2 = cv2.warpAffine(img, M, (w,h))
Perspective Transform
affine 변환만으로는 부족
변환되기 전 3개의 좌표와 변환된 후 3개의 좌표를 알면 변환 매트릭스 M을 구할 수 있고, 이 M을 cv2.warpAffine()
함수에 적용하면 됩니다.
- Affine Transform
최소 3개의 점
h, w = img.shape[:2]
pts1 = np.float32( [50,50], [200,50], [20,200] )
pts2 = np.float32( [10,100], [200,50], [100,250] )
M = cv2.getPerspectiveTransform(pts1, pats2)
img2 = cv2.warpPerspective(img, M, (w, h))
- Perspective Transform
4개의 점 (사각형)
h, w = img.shape[:2]
pts1 = np.float32( [0,0], [300,0], [0,300], [300,300])
pts2 = np.float32( [56,56], [368,52], [28,387], [389,390])
M = cv2.getPerspectiveTransform(pts1, pats2)
img2 = cv2.warpPerspective(img, M, (w, h))
변환되기 전 4개 좌표와 변환된 후 4개 좌표를 통해 변환 매트릭스를 구합니다.
M = cv2.getPerspectiveTransform(pts1, pts2)
'Python > Image vision' 카테고리의 다른 글
Corner - 2 (0) | 2020.01.20 |
---|---|
Corner - 1 (0) | 2020.01.20 |
OCR 이미지 문자열 추출 (Tesseract) (0) | 2020.01.20 |
Morphological Transformations (0) | 2020.01.20 |
Contour Feature (0) | 2020.01.20 |