본문 바로가기

개인공부/python

나 혼자 하는 프로젝트 5탄 - OpenCV - 6. 이미지 변형(블러, 원근)

이미지 데이터를 불러와 작업하는 경우, 보통 전처리라고 하여 이미지내의 불필요한 부분을 걸러내는 작업을 진행하게 된다. 이를 이미지 변형이라고 한다.

흑백으로 변경하는 것은 앞서 공부했었고, cv2.imread()의 옵션값으로 cv2.IMREAD_CRAYSCALE 을 설정해 주면 된다.

하지만 이 경우에는 원본 이미지의 색상을 알 수 없기에, 비교하기 위해서는 다시 한번 더 원본 이미지를 불러와야 한다.

캡쳐를 위해 'img'창은 닫았다...

cv2.cvtColor()를 이용하면 이미 불러온 이미지 자체를 흑백으로 전환 가능하다.

2개의 전달값을 사용하는데, 첫번째는 변환 대상, 두번째는 변경할 컬러 cv2.COLOR_BGR2GRAY 즉 BGR 타입에서 Gray 타입으로 변경한다는 뜻이다.

 

블러(Blur)효과는 이미지를 흐리게 전환해 준다.

이는 외곽선 따는 작업을 좀더 빠르게 진행하고자 할때 사용한다.

블러 방법은 가우시안 블러이다.(다른 방법들은 구글링 !!)

먼저 커널 사이즈를 다르게 적용한 모습이다.

코드를 살펴보면

kernel 사이즈는 양수의 홀수로 지정해 주어야 한다. 일반적으로 (3,3), (5,5), (7,7)을 가장 많이 사용한다.

cv2.GaussianBlur()를 사용하여 블러처리를 사는데, 총 3개의 값을 전달받는다

첫번째는 대상 이미지, 두번째는 kernel 사이즈, 3번째는 표준편차(sigma x) 이다.

커널 사이즈 값이 커질수록 블러 효과가 좀더 강해진다.

 

다음은 표준 편차 값 변화에 따른 블러 효과 적용이다.

코드를 살펴보면 

정확한 확인을 위해 커널 사이즈는 모두 (0, 0)으로 설정하였고, 표준편차값만 1,2,3으로 설정해 두었다.

역시 값이 클수록 블러 효과가 강해진 모습니다.

 

우리가 핸드폰 카메라로 문서를 찍으면 정확한 정사각형이 아닌, 마름모 형태로 나오게 된다.

이는 원근법에 의해 멀리 있는 물체는 작게, 가까이 있는 물체는 크게 보이기 때문인데, 이를 직사각형 처럼 펼치는 방법을 공부해보자.

pixabay에서 newpaper로 검색한 이미지

이렇게 가져온 이미지 중에

딱 이부분을 원근처리하여 직사각형으로 만들어 보고자 한다.

 

먼저. 대상이될 부분의 위치 좌표를 알아와야 한다.

이는 그림판으로 간단하게 해결 가능하다.

아래쪽 창을 보면, 전체 이미지 픽셀 크기가 나오고, 왼쪽편에 현재 마우스 위치에 따른 픽셀 좌표가 나온다.

이렇게 4 모퉁이의 위치 좌표를 가져다가 np.array()를 통해 배열을 만들어 주어야 한다.

src 는 대상이 되는 이미지의 좌표 데이터이고, dst 는 새로운 창의 좌표 데이터이다.

즉 [510, 360] 은 새 창의 [0,0]으로 [1010, 350]은 [ width(640), 0] 으로 이미지의 위치가 cv2.getPerspectiveTransform()이라는 함수에 의해 변환된다.

이제 cv2.warpPerspective()함수를 이용해 원본 이미지, 실행할 함수, 새 이미지 크기 순서로 전달값을 전달하면

이렇게 새로운 직사각형 이미지를 얻을 수 있다.

 

위 코드를 그대로 이용하면, 아래와 같이 회전된 이미지도 수직 방향으로 세울수 있다.

width, height 값은 임의로 설정하던지, 좌표를 얻어 온 다음에 대략적인 값을 얻어서 사용하면 된다.