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) 알고리즘에 의해 색감 결정된다.
세팅에따라 사진을 차갑게, 따뜻하게 하는 등 색감을 결정할 수 있다.
'프로그래머스 > OPENCV' 카테고리의 다른 글
특정 색상 영역 추출 하기 [다시] (0) | 2022.12.07 |
---|---|
컬러영상처리 (0) | 2022.12.07 |
리매핑(remapping) (0) | 2022.12.05 |
어파인 변환과 투시 변환 ( with bird eyeview) (0) | 2022.12.05 |
회전변환과 기하학적 변환의 조합 [다시] (0) | 2022.12.05 |