candies.png
0.69MB
lenna.bmp
0.75MB

색분리 시 사용하는 split 함수

 

채널분할

void split(const Mat& src, Mat* mvbegin);
void split(InputArray src, OutputArrayOfArrays mv);

src: 다채널 행렬

mvbegin: (출력)Mat 배열 주소

mv : (출력) 행렬의 벡터 .  vector<Mat>.

 

#include <iostream>
#include<vector>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("lenna.bmp");

	if (src.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	vector<Mat> planes;
	split(src, planes);  // BGR  성분이 들어간 SRC 3채널 행렬을 3개로 나눠 planes에 할당.
	imshow("B", planes[0]);
	imshow("G", planes[1]);
	imshow("R", planes[2]);
	waitKey();
}

 레나 이미지에는 R성분이 강해서 R부분에서 밝기가 크게 표현된다.

 

 

채널 결합

void merge(const Mat* mv, size_t count, OutputArray dst);
void merge(InputArrayOfArrays mv, OutputArray dst);

mv:  (입력) 1채널 Mat 배열 또는 행렬의 벡터

count : (mv가 Mat 타입의 배열인 경우) Mat 배열의 크기

dst: (출력) 다채널행렬

 

 

#include <iostream>
#include<vector>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;
#define TC 2

int main()
{
	Mat src = imread("lenna.bmp");

	if (src.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	vector<Mat> planes;
	split(src, planes);  // BGR  성분이 들어간 SRC 3채널 행렬을 3개로 나눠 planes에 할당.
#if TC==1
	imshow("B", planes[0]);
	imshow("G", planes[1]);
	imshow("R", planes[2]);
	waitKey();
#else if TC ==2 // 분할된 BGR 을 B,R 순서 바꾼 후 합병 
	swap(planes[0], planes[2]);
	Mat dst;
	merge(planes, dst);
	imshow("dst", dst);
	waitKey();
#endif
}

\

 

 


 

#include<iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

void split_bgr() {
	Mat src = imread("candies.png", IMREAD_COLOR);
	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	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();
	//노랑은 빨강과 녹색이 합쳐진 경우라 녹색인경우와 빨강색인경우 노랑색도 밝기가 크게 나타남.
}
void split_hsv() {
	Mat src = imread("candies.png", IMREAD_COLOR);
	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}
	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]);  // 0~ 179    빨강(0)부터 주노초파남보... 빨주노초파남보...  순으로. 빨강색에 가까운건 밝게 나옴. 주황은 0에 가까운값, 빨강은 179에 가까운 값. 비슷한 빨강이라해도 h값은 0에 가까운값으로 또는 179에 가까운 값에 나타날 수있다. ( 179 == 360 / 2 -1)  , 초록보다 파란색이 더 밝음. 
	imshow("S plane", hsv_planes[1]); // 입력영상이 원색으로 가깝기에 saturation이 모두 크게 나타남.
	imshow("V plane", hsv_planes[2]); // 밝기 성분을 나타내며, v 공식은 grayscale 구하는 공식보단 입력영상 rgb 색상에서 최대값 골라서 v로 설정을 하기에 grayscale 과는 차이가 있는 밝기.
	waitKey();
}
void split_ycrcb() {
	Mat src = imread("candies.png", IMREAD_COLOR);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	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]);  // 입력영상을 grayscale로 변환것과 동일
	imshow("Cr plane", ycrcb_planes[1]); //  빨강색 성분 강할 시 Cr성분이 밝게 나타남
	imshow("Cb plane", ycrcb_planes[2]); // 파랑색 성분 강할 시 Cb 성분 밝게 나타남

	waitKey();
	destroyAllWindows();
}
int main(void) {
	//split_bgr();
	//split_hsv();
	split_ycrcb();
}

 

hsv split 시

 

 

ycrcb split 시

Y: 휘도성분 (대상 물체에 반사되는 빛의 양)

CrCb : 색상성분


화이트 밸런스(White Balance) 조절에 따른 색차이

 1) 화이트 밸런스: 흰색을 흰색으로 보이게 만드는 기법. 색조화(color balance), 색온도(color temperature)

 2) 디지털 카메라에서 촬영된 이미지는 AW(Auto White-Balance == AWB) 알고리즘에 의해 색감 결정된다.

세팅에따라 사진을 차갑게, 따뜻하게 하는 등 색감을 결정할 수 있다.

 

 

+ Recent posts