색 공간

강형우·2022년 12월 5일
0

OpenCV

목록 보기
15/17

색 인지

색 인지

  • 색(color)

    • 사람 눈에 있는 원추 세포(원뿔 세포)가 빛의 특정 파장에 따라 다르게 반응하여 인지하는 것
    • 가시 광선의 파장: 약 380~750nm
  • 사람의 눈이 색을 인지하는 과정

  • 색상 표현 방법

다양한 색 공간: RGB, HSV, YCrCb

다양한 색 공간

  • 색 공간 변환

  • RGB 색 공간

    • 빛의 삼원색인 빨간색(R), 녹색(G), 파란색(B)을 혼합하여 색상을 표현
    • 카메라 센서 Bayer 필터, TV & 모니터, 비트맵
  • HSV 색 공간

    • Hue, Saturation, Value를 이용하여 색을 표현하는 방법
      • Hue: 색상, 색의 종류. 0~360 tkdldml rkrehfh vygus
      • Saturation: 채도, 색의 탁하고 선명한 정도
      • Value: 명도, 빛의 밝기
    • 유사한 색 공간으로 HSL(Lightness), HSI(Intensity)가 있음
  • HSV 값 범위

    • 일반적인 비트 영상의 경우, Hue 값의 범위를 0~360로 표현할 수 없으므로, Hue/2를 대신 사용
      • 0 <= H <= 179
      • 0 <= S <= 255
      • 0 <= V <= 255
  • YCrCb 색 공간

    • 휘도(Luminance)와 색차(Chrominance) 성분을 이용하여 색을 표현하는 방법
      • Y: 휘도, 밝기 정보(Luma)
      • Cr, Cb: 색차(chroma)
    • 유사한 색 공간으로 YIQ, YUV, YPbPr 등이 있음
  • YCrCb 값 범위

    • 일반적인 8비트 영상의 경우
      - 0 <= Y <= 255
      - 0 <= CR <= 255
      - 0 <= CB <= 255
  • 채널 분리

void split(const Mat& src, Mat* mvbegin);
void split(InputArray src, OutputArrayOfArrays mv);
  • src: (입력) 다채널 해렬
  • mvbegin: (출력) Mat 배열의 주소
  • mv: (출력) 행렬의 벡터. vector<Mat>
  • 예제 코드:
Mat src = imread("lenna.bmp");
vector<Mat> planes;
split(src, planes);

  • 채널 결합
void merge(const Mat* mv, size_t count, OutputArray dst);
void split(InputArrayOfArrays mv, OutputArray dst);
  • mv: (입력) 1채널 Mat 배열 또는 행렬의 벡터
  • count: (mv가 Mat 타입의 배열인 경우) Mat 배열의 크기
  • dst: (출력) 다채널 행렬
Mat src = imread("lenna.bmp");
vector<Mat> planes;
split(src, planes);
swap(planes[0], planes[2]);

Mat dst;
merge(planes, dst);

  • 컬러 영상의 색상 평면 나누기
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

void split_bgr();
void split_hsv();
void split_ycrcb();

int main()
{
	split_bgr();
	split_hsv();
	split_ycrcb();
}

void split_bgr()
{
	Mat src = imread("candies.png", IMREAD_COLOR);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}
	// RGB 색상 평면 나누기
	vector<Mat> bgr_planes;
	split(src, bgr_planes);

	imshow("src", src);
	imshow("B plane", bgr_planes[0]);
	imshow("G plane", bgr_planes[1]);
	imshow("R plane", bgr_planes[2]);

	waitKey();
	destroyAllWindows();
}

void split_hsv()
{
	Mat src = imread("candies.png", IMREAD_COLOR);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}
	// HSV 색상 평면 나누기
	Mat src_hsv;
	cvtColor(src, src_hsv, COLOR_BGR2HSV);

	vector<Mat> hsv_planes;
	split(src_hsv, hsv_planes);

	imshow("src", src);
	imshow("H plane", hsv_planes[0]);
	imshow("S plane", hsv_planes[1]);
	imshow("V plane", hsv_planes[2]);

	waitKey();
	destroyAllWindows();
}

void split_ycrcb()
{
	Mat src = imread("candies.png", IMREAD_COLOR);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}
	// YCrCb 색상 평면 나누기
	Mat src_ycrcb;
	cvtColor(src, src_ycrcb, COLOR_BGR2YCrCb);

	vector<Mat> ycrcb_planes;
	split(src_ycrcb, ycrcb_planes);

	imshow("src", src);
	imshow("Y plane", ycrcb_planes[0]);
	imshow("Cr plane", ycrcb_planes[1]);
	imshow("Cb plane", ycrcb_planes[2]);

	waitKey();
	destroyAllWindows();
}

밝기 정보와 색 정보 특성

밝기 정보와 색 정보 특성

  • 컬러 영상을 밝기 정보와 색 정보로 분할
    • 입력 컬러 영상을 YCrCb 색 공간으로 변경한 후, Y 평면과 CrCb 평면을 따로 화면 출력
    • Y 성분은 객체의 디테일을 잘 표현하지만, CrCb 성분은 디테일을 잘 표현하지 못하고 객체 구분이 잘 안됨.
  • 화이트 밸런스(White Balance)조절에 따른 색 차이
    • 화이트밸런스(White Balance): 흰색을 흰색으로 보이게 만드는 기법, 색 조화(color balance), 색 온도(color temperature)
    • 디지털 카메라에서 촬영된 이미지는 AW(Auto White-Balance) 알고리즘에 의해 색감이 결정됨

0개의 댓글