본문 바로가기
  • AI 개발자가 될래요
컴퓨터비전

[Python/OpenCV] cv2.applyColorMap() / custom Colormap 사용법

by 꿀개 2023. 6. 21.

Python에서  Opencv의 ColorMap을 활용하여 이미지 색상 변경법

 

이미지의 전체적인 색상을 다른 색상으로 변경하고 싶을 때 opencv의 applyColorMap() 메소드를 이용하면 된다.

 

메소드 형식은 다음과 같다.

사전 정의된 color map 활용 방식

◆ applyColorMap() [1/2]

void cv::applyColorMap ( InputArray  src,
    OutputArray  dst,
    int  colormap 
  )    
Python:
  cv.applyColorMap( src, colormap[, dst] ) -> dst
  cv.applyColorMap( src, userColor[, dst] ) -> dst

#include <opencv2/imgproc.hpp>

Applies a GNU Octave/MATLAB equivalent colormap on a given image.

Parameters
src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3.
dst The result is the colormapped source image. Note: Mat::create is called on dst.
colormap The colormap to apply, see ColormapTypes
 

Opencv 에서 사전 정의한 colormap flag는 아래 링크를 참고

https://hsyaloe.tistory.com/68

 

[Python] Opencv Colormap 색상 플래그

https://docs.opencv.org/4.x/d3/d50/group__imgproc__colormap.html OpenCV: ColorMaps in OpenCV enum cv::ColormapTypes { cv::COLORMAP_AUTUMN = 0, cv::COLORMAP_BONE = 1, cv::COLORMAP_JET = 2, cv::COLORMAP_WINTER = 3, cv::COLORMAP_RAINBOW = 4, cv::COLORMAP_OCEA

hsyaloe.tistory.com

 

사전 정의된 flag를 사용하는 방법은 매우 간단하다.

import cv2

input = cv2.imread("forest.png", cv2.IMREAD_COLOR)

output = cv2.applyColorMap(input, cv2.COLORMAP_PINK)

cv2.imshow("output", output)
cv2.waitKey()

 

이미지를 불러와서 cv2.applyColorMap 메소드의 input으로 넣고, 원하는 flag를 넣어주면 colormap 변환이 된다.

입력 이미지가 다음과 같이 초록색 위주의 색 분포를 갖고 있을 때

입력 이미지

 

 출력 이미지는 다음과 같이 분홍색 위주의 색 분포를 갖고 있다.

사전 정의된 flag를 이용해 colormap 변환을 한 결과, cv2.applyColorMap

 

opencv에서 사전 정의한 flag를 사용하지 않고, 사용자 정의 colormap을 이용해 이미지 색 변환을 할 수 있다.

사용자 정의 (Custom) color map 활용 방식

◆ applyColorMap() [2/2]

void cv::applyColorMap ( InputArray  src,
    OutputArray  dst,
    InputArray  userColor 
  )    
Python:
  cv.applyColorMap( src, colormap[, dst] ) -> dst
  cv.applyColorMap( src, userColor[, dst] ) -> dst

#include <opencv2/imgproc.hpp>

Applies a user colormap on a given image.

Parameters
src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3.
dst The result is the colormapped source image. Note: Mat::create is called on dst.
userColor The colormap to apply of type CV_8UC1 or CV_8UC3 and size 256

 

그러나 이는 조금 더 복잡하다. (256, 1, 3) shape을 갖는 룩 업 테이블(LUT) 를 만들어야 하기 때문이다.

필자는 custom colormap이 BGR(167, 152, 235) 을 최댓값을 갖도록 만들었다.

import cv2
import numpy as np

input = cv2.imread("forest.png", cv2.IMREAD_COLOR)

# (256, 1, 3) shape을 갖는 빈 array 선언
lut = np.zeros((256, 1, 3), dtype=np.uint8)

# B, G, R 채널마다 원하는 값의 범위를 갖는 array 선언
# np.linspace는 start부터 end까지의 값을 갖는 총 num개의 array를 만들어 준다.
# 예를 들어 userColor_8UC1는 0부터 167까지의 숫자를 256개 만들어준다.
userColor_8UC1 = np.linspace(0, 167, num=256, endpoint=True, retstep=False, dtype=np.uint8)
userColor_8UC2 = np.linspace(0, 152, num=256, endpoint=True, retstep=False, dtype=np.uint8)
userColor_8UC3 = np.linspace(0, 235, num=256, endpoint=True, retstep=False, dtype=np.uint8)

# lut에 채널 별로 저장한다.
lut[:, 0, 0] = userColor_8UC1
lut[:, 0, 1] = userColor_8UC2
lut[:, 0, 2] = userColor_8UC3

# custom colormap 적용
output = cv2.applyColorMap(input, lut)

cv2.imshow("output", output)
cv2.waitKey()

 

np.linspace를 이용하여 각 채널 별 LUT 을 만들어 cv2.applyColorMap()의 두 번째 매개변수로 넣어주면 된다.

 

입력 이미지

입력 이미지

 

출력 이미지는 아래와 같다.

custom colormap을 이용하여 색 변환 결과

 

 

본 내용 2차 가공시 출처를 밝히길 바란다.