Acdong
Learn by doing
Acdong
전체 방문자
오늘
어제
  • 분류 전체보기
    • Economy
      • Saving Money
    • Self-improvement
    • Thoughts
    • Machine learning
      • Deep Learning
      • Chatbot
      • NLP
    • MLops
      • AWS
      • Container
      • Serving
    • Computer Vision
    • Data Science
      • ADsP
      • R
    • Project
    • Python
      • Data Structure & Algorithm
    • C,C++
    • API
      • ElasticSearch
    • Error Note
    • Network
    • RDBMS
      • SQL

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • [GitHub]

인기 글

태그

  • R시각화
  • nlp
  • 다중공선성
  • 데이터 전처리
  • sbert
  • c포인터
  • SentenceTransformer
  • 머신러닝
  • pandas
  • 회귀계수
  • 포인터
  • 이미지 전처리
  • 어텐션
  • R
  • Numpy
  • 기계학습
  • Python
  • R그래프
  • plot()
  • 존댓말 반말 분류

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Acdong

Learn by doing

[이미지 전처리] BGR and RGB
Computer Vision

[이미지 전처리] BGR and RGB

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로 가져온다고 한다. 

이점을 항상 주의하자!!

반응형
저작자표시 비영리 (새창열림)

'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
    'Computer Vision' 카테고리의 다른 글
    • [이미지 전처리]. ImageDataGenerator 클래스 : 이미지 제너레이터
    • [이미지 전처리] Pillow PIL , Opencv cv2 , 이미지 형태 정규화(RGB, RGBA)
    • [이미지 전처리]. 이미지 차원 추가하기 , np.append_dim()
    • [이미지 전처리] Url to image , url 주소를 통한 이미지 처리
    Acdong
    Acdong
    E-mail : alswhddh@naver.com / 자연어처리와 MLops 를 연구하고 있는 스타트업 개발자입니다.

    티스토리툴바