잘생긴 얼음의신님의 이글루입니다

qordidtn02.egloos.com

포토로그



[python]image rotation,filling blank space -image 회전,빈공간채우기 python

PYHTHON을 이용하여 image 회전과, 회전후 생긴 black space(blank space..정확한 명칭이 뭘까요..)를 채우는 코드에 대해서 다뤄보겠습니다.


보안상 코드 전체를 공개하지 못하는점 양해 부탁드립니다. 

1. image array rotation(이미지 회전)

image array회전과 관련해서 기존에 제공되고 있는 수 많은 라이브러리중 저는 skimage 라이브러리를 사용했습니다. 
skimage라이브러리의 장점은 2x2 dimension이 아닌 2차원행렬(ex)48x64)같은 행렬에도 회전연산이 가능하다는 점입니다.
일반적으로 이미지파일(ex)jpg)를 회전하거나 변형하는데에는 openCV 라이브러리를 사용하지만 
image를 array데이터로 취급하는 경우 openCV라이브러리로는 원하는 데이터를 얻기 힘듭니다. 

따라서 skimage rotate함수를 사용해봤습니다. 사용법은 아래와 같습니다.

from skimage.transform import rotate로 skimage 라이브러리의 rotate함수를 import한 다음 
회전하고 싶은 image array data와 회전 각도(angle)을 함수의 parameter로 넣어주면 됩니다. 

이때 주의해야 할 점은 data의 datatype이 array여야 한다는 점입니다. 
image 데이터가 list로 되어 있을 경우 아래와 같은 error메세지가 나올 것입니다. 



이런 경우에는 아래와 같이 list를 numpy의 array함수를 이용해 array type으로 바꿔주면 됩니다. 



아래의 링크에서 더 다양한 예시를 확인할 수 있습니다.



2. blank space 채우기

저 같은 경우에는 이미지 회전을 5~10도 정도로 적게 주면서 기존 이미지와 컬러차이가 크지 않도록 이미지를 변형하는 것이 목적이었기 때문에 이미지 회전 후 생긴 blank space를 반드시 채워줘야 했습니다. 

blank sapce를 채우는 방법으로 간편하게 따로 제공되는 라이브러리 함수가 있는지 모르겠습니다... 제가 찾아봤을때는 별다른게 없었습니다 ㅠ 아시는 분은 알려주세요. 

저는 기존 이미지와 컬러차이가 크지않도록 이미지를 변형하는것이 목적이었기 때문에 빈공간은 원본이미지의 array data로 채워줬습니다. 
이미지 회전 후 생기는 blank space는 데이터를 보면 모두 0으로 채워져있기 때문에 image array에서 data값으로 0을 가지는 array index를 찾아낸후 해당 index를 원본이미지의 data값을 채워줬습니다. 

코드는 아래와 같습니다.

rotate_data = np.reshape(rotate_data, (rotate_data_col*rotate_data_row))
blank_idx = [i for i in range(rotate_data) if 0 in rotate_data[i]]
for i in blank_idx:
rotate_data[i] = org_image[i]


우선 2차원의 rotate_data를 1차원으로 reshape한후 0인 데이터를 가진 idx를 찾은 후 해당 idx를 원본이미지로 채워줬습니다.


이렇게 하면 image array 회전과 blank sapce 채우기 완성입니다!!

덧글

댓글 입력 영역