Attention please

[OpenCV] OpenCV로 이미지 전처리 하기 본문

OpenCV

[OpenCV] OpenCV로 이미지 전처리 하기

Seongmin.C 2023. 1. 9. 01:52

OpenCV를 이용하여 읽어온 이미지를 다양하게 전처리 할 수 있다. 다음은 원본 이미지이다.

 

 

 

 

 

 

 

 

 

크기 조정

이미지 size를 조정하는데 총 2가지 방법이 존재한다.

 

  • 직접 size 설정
  • 비율로 size 조절

먼저 고정된 size인 (400, 500)로 resize를 하였다.

 

import cv2

img = cv2.imread('cat_img.jpg')
dst = cv2.resize(img, (400, 500))

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

cv2.waitKey(0)
cv2.destroyAllWindows()

왼쪽 : 원본, 오른쪽 : resize

 

다음으로 설정한 비율에 맞게 resize를 하였다.

 

dst = cv2.resize(img, None, fx=0.5, fy=0.5)

 

위와 같이 이미지의 size를 축소하거나 확대하면 픽셀이 겹치거나 비어버리는 문제가 생긴다. 이를 해결하기 위해 보간법이라는 것이 존재하며, opencv 라이브러리에서도 보간법을 지원하고 있다.

 

  • cv2.INTER_AREA : 크기 줄일 때 사용
  • cv2.INTER_CUBIC : 크기 늘릴 때 사용 (속도 느림, 퀄리티 좋음)
  • cv2.INTER_LINEAR : 크기 늘릴 때 사용 (기본값)

사용법은 다음과 같이 cv2.resize() 함수의 파라미터 interpolation 을 설정해주면 된다.

 

cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)

 

 

 

 

 

 

 

 

이미지 자르기

이미지를 자르는 것은 slicing을 통해 쉽게 할 수 있다. 기존의 이미지에서 원하는 영역만큼 slicing을 하여 새롭게 잘라낸 이미지를 만든다.

 

crop = img[100:200, 200:400]

 

세로는 100~200, 가로는 300~400 의 영역만큼 이미지를 새롭게 출력한다.

 

 

 

 

 

 

 

 

 

이미지 대칭

opencv 라이브러리는 cv2.flip() 과 같이 이미지를 대칭시켜주는 함수가 존재한다. 

 

먼저 좌우를 대칭시키기 위해서는 flipCode가 0 이상이도록 입력한다.

flip_horizontal = cv2.flip(img, 1) # flipCode > 0 : 좌우 대칭 Horizontal

 

 

 

 

상하 대칭시키기 위해서는 flipCode가 0이도록 입력하면 된다.

flip_vertical = cv2.flip(img, 0) # flipCode == 0 : 상하 대칭 Vertical

 

 

 

 

상하좌우 모두 대칭시키기 위해서는 flipCode를 0 보다 작은 값으로 설정해준다.

flip_both = cv2.flip(img, -1) # flipCode < 0 : 상하좌우 대칭 Vertical

 

 

 

 

 

 

 

 

 

 

이미지 회전

cv2.rotate() 함수는 이미지를 회전시킬 때 사용된다. 

 

먼저 시계방향으로 90도 회전하기 위해 파라미터 값을 cv2.ROTATE_90_CLOCKWISE 로 준다.

rotate_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

 

 

 

 

다음으로 시계방향 180도 회전하기 위해 파라미터 값을 cv2.ROTATE_180 으로 준다.

rotate_180 = cv2.rotate(img, cv2.ROTATE_180)

 

 

 

 

다음으로 시계 반대 방향으로 90도 회전하기 위해 파라미터 값을 cv2.ROTATE_90_COUNTERCLOCKWISE 로 준다.

rotate_270 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)

 

 

 

 

 

 

 

 

 

 

흑백 이미지 변형

cv2.imread 할 때 흑백으로 불러오는 것이 아닌 불러온 이미지를 흑백으로 변경할 때는 cv2.cvtColot() 함수를 사용하여야 한다.

dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

 

 

 

 

 

 

 

 

 

이미지 흐림 효과 주기

이미지의 흐린 효과를 주는데는 총 2가지 방법이 존재한다. 그 중 먼저 kernel 사이즈에 따라 흐림의 정도를 받는 cv2.GaussianBlur() 함수를 사용할 수 있다.

 

총 커널의 크기는 (3,3), (7,7) 이다.

kernel_3 = cv2.GaussianBlur(img, (3,3), 0)
kernel_7 = cv2.GaussianBlur(img, (7,7), 0)

 

 

kernel의 크기가 더 큰 오른쪽 이미지가 더 흐리게 보이는 것을 확인 할 수 있다.

 

 

 

다음으로는 표준편차의 변화에 따라 흐림의 정도를 표현할 수 있다. 똑같이 cv2.GaussianBlur() 함수를 사용하지만 kernel의 크기는 (0,0)으로 통일하며, 표준편차만 변화를 준다.

 

sigma_1 = cv2.GaussianBlur(img, (0,0), 1)
sigma_3 = cv2.GaussianBlur(img, (0,0), 3)

 

 

표준편차가 1인 왼쪽 그림에 비해 표준편차가 3인 오른쪽 그림이 더 흐리게 보이는 것을 확인할 수 있다.

 

Comments