Computer Vision

[이미지 전처리] BGR and RGB

Acdong 2020. 12. 22. 13:32
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로 가져온다고 한다. 

이점을 항상 주의하자!!

반응형