Python에서 Opencv의 ColorMap을 활용하여 이미지 색상 변경법
이미지의 전체적인 색상을 다른 색상으로 변경하고 싶을 때 opencv의 applyColorMap() 메소드를 이용하면 된다.
메소드 형식은 다음과 같다.
사전 정의된 color map 활용 방식
◆ applyColorMap() [1/2]
void cv::applyColorMap | ( | InputArray | src, |
OutputArray | dst, | ||
int | colormap | ||
) |
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.
Parameterssrc | 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
사전 정의된 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 변환이 된다.
입력 이미지가 다음과 같이 초록색 위주의 색 분포를 갖고 있을 때
출력 이미지는 다음과 같이 분홍색 위주의 색 분포를 갖고 있다.
opencv에서 사전 정의한 flag를 사용하지 않고, 사용자 정의 colormap을 이용해 이미지 색 변환을 할 수 있다.
사용자 정의 (Custom) color map 활용 방식
◆ applyColorMap() [2/2]
void cv::applyColorMap | ( | InputArray | src, |
OutputArray | dst, | ||
InputArray | userColor | ||
) |
cv.applyColorMap( | src, colormap[, dst] | ) -> | dst | |
cv.applyColorMap( | src, userColor[, dst] | ) -> | dst |
#include <opencv2/imgproc.hpp>
Applies a user colormap on a given image.
Parameterssrc | 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()의 두 번째 매개변수로 넣어주면 된다.
입력 이미지
출력 이미지는 아래와 같다.
본 내용 2차 가공시 출처를 밝히길 바란다.
'컴퓨터비전' 카테고리의 다른 글
[OpenCV] SIFT, SURF에 대한 간단 설명 (0) | 2023.09.06 |
---|---|
지역 특징 검출 (0) | 2023.09.05 |
[Python] Opencv Colormap 색상 플래그 (0) | 2023.06.16 |
컬러 영상의 히스토그램 매칭(Histogram Matching) / 파이썬 코드 (1) | 2023.05.02 |
[C++/OpenCV] 주파수 영역 필터링 / 저주파 및 고주파 통과 필터링 (0) | 2022.07.20 |