티스토리 뷰
OpenCV 에서 Basic image processing 는 다음과 같이 9가지를 이야기 하고 있습니다.
- 1: Translation (상하, 좌우 이동)
- 2: Rotation (그림의 회전 ,중심축이 어디냐?)
- 3: Resizing (이미지의 사이즈 조정, Aspect Ratio고려)
- 4: Flipping (수평, 수직으로 뒤집기)
- 5: Cropping (그림 일부만 가져오기)
- 6: Image arithmetic (그림을 더 진하게, 연하게 만들기)
- 7: Bitwise operations (그림의 Bit 연산)
- 8: Masking (마스크)
- 9: Splitting and merging channels ( Color Channel 로 나누고, 합치고)
오늘은 Transition 과 Rotation 두가지만 알아보겠습니다.
Transition
우선 Transition 이라 하면 이미지를 이동시키는 것입니다. 사진의 이동은 상하(y축), 좌우(x축)로 움직이는 것을 고려하지 앞,뒤(z축)은 고려를 하지 않습다.
이것을 행렬(Matrix)로 표현하면 위와 같습니다. x축, y축 이동 값을 행렬로 표현해서 cv2.warpAffine 함수를 호출해야 합니다. 아래와 같이...
1 2 3 4 5 | image = cv2.imread('images/beach.png') # X 방향으로 25, Y 방향으로 50 이동할때 M = np.float32([[1, 0, 25], [0, 1, 50]]) shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) cv2.imshow("Shifted Down and Right", shifted) | cs |
그런데 warpAffine 이 무슨 말인지도 모르겠고, 늘 Matrix 를 정의 해야 하기 때문에 복잡합니다. 그래서 OpenCV 대가인 Dr. Adrian Rosebrock 는 imutils 패키지를 추천합니다. (설치는 pip install imutils)
imutils 패키지를 사용하면 다음과 같이 변경이 됩니다.
1 2 3 4 | image = cv2.imread('images/beach.png') # X 방향으로 25, Y 방향으로 50 이동할때 shifted = imutils.translate(image, 25, 50) # translate는 이해하기 쉬운 용어 cv2.imshow("Shifted Down and Right", shifted) | cs |
translate 라는 이해하기 쉬운 함수 이름을 쓰기 때문에 명확해 지는 것 같습니다.
Rotation
Rotation에서 신경을 써야 하는 부분은 두가지 입니다.
우선 회전을 하는 중심 축을 어디에 둘 것이냐 입니다. Top Left가 될수도 있고, 그림의 중심이 될수도 있습니다.
두번째는 회전 각도입니다. 회전 각도는 시간 반대 방향이 + 이동 각도이고, 시계 방향이 - 이동 각도라는 것을 이해하고 있으면 됩니다.
OpenCV를 기준으로 그림의 중심을 시계 반대 방향으로 45도 회전을 시킨다고 하면 다음과 같은 소스코드가 나옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 | # load the image and show it image = cv2.imread("images/beach.png") cv2.imshow("Original", image) # grab the dimensions of the image and calculate the center of the image (h, w) = image.shape[:2] (cX, cY) = (w / 2, h / 2) # rotate our image by 45 degrees M = cv2.getRotationMatrix2D((cX, cY), 45, 1.0) rotated = cv2.warpAffine(image, M, (w, h)) cv2.imshow("Rotated by 45 Degrees", rotated) | cs |
여기서도 중심점과 각도를 변형하는 행렬(Matrix)를 선언하고, 이것은 warpAffine이라는 어려운 함수를 사용해야 합니다.
그래서 여기서도 imutils 함수를 사용하는 것을 권장합니다. imutils 를 사용하면 다음과 같이 깔끔해 집니다.
1 2 3 4 5 6 7 8 9 10 11 | # load the image and show it image = cv2.imread("images/beach.png") cv2.imshow("Original", image) # 회전의 중심축을 정의하지 않으면 그림의 중심이 됨 rotated = imutils.rotate(image, 45) cv2.imshow("Rotated by 180 Degrees", rotated) # 회전의 중심 축을 정의하면 해당 중심축으로 회전을 함. rotated = imutils.rotate(image, 45, center=(0, 0)) # 회전 중심축 TOP LEFT cv2.imshow("Rotated by 180 Degrees", rotated) | cs |
'OpenCV' 카테고리의 다른 글
OpenCV 기초 - Image Processing(Resize, Flipping) (0) | 2018.04.02 |
---|---|
OpenCV 기초 -마우스 이벤트와 그림(선,사각형,원) 그리기 (0) | 2018.04.01 |
OpenCV 기초 - 이미지 파일 오픈/변경/저장 (0) | 2018.04.01 |
OpenCV 기초 - 왜 RBG가 아니라 BGR로 저장할까? (0) | 2018.04.01 |
댓글