728x90
openCV 와 PIL 패키지를 왓다갔다 사용하다 보면
이런 괴상한 형식의 이미지를 발견하게 된다.
이런 이유를 계속찾아봤더니 두 패키지의 이미지불러오기 방식이 다르기 때문이였다.
openCV 는 기본적으로 BGR의 형태로 변환하여 데이터를 가져오고
PIL 은 이미지가 가지고있는 형식 그대로를 가져온다.
def stringToRGB(base64_string):
imgdata = base64.b64decode(base64_string)
dataBytesIO = io.BytesIO(imgdata)
image = Image.open(dataBytesIO)
return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)
이 함수를 통해 문자열이미지 데이터를 변환했을 때 뒤에있는
cv2.COLOR_BGR2RGB 를 통해 BGR의 형태의 데이터 즉,
cv2.imread를 통해 불러온 데이터를 BGR에서 RGB 형식으로 바꿔주게된다.
즉 B와 R 의 순서를 바꿔주는 함수라고 볼 수 있다.
그런데 애초에 cv.imread로 읽은 데이터가 아니라 RGB 의 이미지가 들어온다면
함수를 거쳐 RGB->BGR로 바꾸게된다. numpy가 RGB인지 BGR인지 알 수 없기 때문이다.
그래서 위의 이미지와 같이 괴상한 이미지가 나타나는 것이다.
def stringToRGB(base64_string):
imgdata = base64.b64decode(base64_string)
dataBytesIO = io.BytesIO(imgdata)
image = Image.open(dataBytesIO)
return np.array(image)
그럼 이렇게 변환함수를 제거할 경우 어떻게 될까? 이건 저번에 발생했던 차원이 하나 더있는 RGBA 가 들어오면 바로 에러를 발생시킨다.
그래서 다른방법을 찾아보다가 말도안되는 야매를 사용해서 일단 오류를 해결했다. ㅋㅋㅋ
def stringToRGB(base64_string):
imgdata = base64.b64decode(base64_string)
dataBytesIO = io.BytesIO(imgdata)
image = Image.open(dataBytesIO)
if image.mode == "RGB":
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)
return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)
만약 RGB 데이터가 들어올 경우 두 번 교체해서 RGB -> BGR -> RGB 로 바꾼다.
다른 해결법을 찾아보고 다시 이 글을 수정하기 전까지 일단이렇게 사용해보자.
에러보다 중요하게 알아야할 것은
Open cv로 이미지를 불러왔을 때는 BGR의 형태로 변환하여 가져온다는 것이고.
아이러니하게 matplotlib 로 이미지를 볼때는 RGB로 가져온다고 한다.
이점을 항상 주의하자!!
반응형
'Computer Vision' 카테고리의 다른 글
[이미지 전처리]. ImageDataGenerator 클래스 : 이미지 제너레이터 (0) | 2020.12.07 |
---|---|
[이미지 전처리] Pillow PIL , Opencv cv2 , 이미지 형태 정규화(RGB, RGBA) (0) | 2020.12.04 |
[이미지 전처리]. 이미지 차원 추가하기 , np.append_dim() (0) | 2020.12.04 |
[이미지 전처리] Url to image , url 주소를 통한 이미지 처리 (0) | 2020.11.25 |
[이미지 전처리]. image to base64 , base64 to image 변환하는 방법 (2) | 2020.11.25 |