OpenCV-4 split and merge
by
싱글 채널로 visualization
#include <opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
// load an image
Mat my_image = cv::imread("1.jpg", cv::IMREAD_COLOR);
// create a matrix for split
Mat bgr[3];
//Mat BLUE_multi, GREEN_multi, RED_multi;
// my_image와 사이즈가 같은 모두 0으로 채워진 single channel Matrix 생성.
//CV_8UC1 = 픽셀 하나에 0-255 값 가질 수 있다는 뜻 맨 마지막 숫자 1은, 채널값 1이라는 뜻
//Mat Converted_Image = cv::Mat::zeros(my_image.size(), CV_8UC1);
// split image into 3 single-channel matrices
split(my_image, bgr);
//// create 4 windows
namedWindow("Original Image",WINDOW_NORMAL);
resizeWindow("Original Image", 600, 600);
namedWindow("Red", WINDOW_NORMAL);
resizeWindow("Red", 300, 300);
namedWindow("Green", WINDOW_NORMAL);
resizeWindow("Green", 300, 300);
namedWindow("Blue", WINDOW_NORMAL);
resizeWindow("Blue", 300, 300);
//// show 4 windows
imshow("Original Image", my_image);
imshow("Blue", bgr[0]);
imshow("Green", bgr[1]);
imshow("Red", bgr[2]);
cv::waitKey(0);
return 0;
}
결과 이미지
멀티 채널로 visualization
#include <opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
// load an image
Mat my_image = cv::imread("1.jpg", cv::IMREAD_COLOR);
// create a matrix for split
Mat bgr[3];
Mat BLUE_multi, GREEN_multi, RED_multi;
// my_image와 사이즈가 같은 모두 0으로 채워진 single channel Matrix 생성.
//CV_8UC1 = 픽셀 하나에 0-255 값 가질 수 있다는 뜻 맨 마지막 숫자 1은, 채널값 1이라는 뜻
Mat Converted_Image = cv::Mat::zeros(my_image.size(), CV_8UC1);
// split image into 3 single-channel matrices
split(my_image, bgr);
// create 3 channel Color Matrix
Mat R[] = { Converted_Image, Converted_Image, bgr[2] };
Mat G[] = { Converted_Image, bgr[1], Converted_Image };
Mat B[] = { bgr[0], Converted_Image, Converted_Image };
merge(B, 3, BLUE_multi);
merge(G, 3, GREEN_multi);
merge(R, 3, RED_multi);
//cv::split(BLUE_multi, bgr);
//// create 4 windows
namedWindow("Original Image",WINDOW_NORMAL);
resizeWindow("Original Image", 600, 600);
namedWindow("Red", WINDOW_NORMAL);
resizeWindow("Red", 600, 600);
namedWindow("Green", WINDOW_NORMAL);
resizeWindow("Green", 600, 600);
namedWindow("Blue", WINDOW_NORMAL);
resizeWindow("Blue", 600, 600);
//// show 4 windows
imshow("Original Image", my_image);
imshow("Blue", BLUE_multi);
imshow("Green", GREEN_multi);
imshow("Red", RED_multi);
cv::waitKey(0);
return 0;
}
결과 이미지
설명
싱글 채널, 멀티 채널의 Mat를 각각 채널 별로 visualization 해준 모습이다.
싱글 채널에서는, 각 B, G, R 정보에 대해서 싱글 채널로 imshow 했기에, gray scale로 나왔고,
멀티 채널에서는 각 B, G, R 정보를 먼저 뽑아,
Mat R[], G[], B[]에 그 채널을 제외한 나머지 채널은 0인 값을 갖는 3 - channel Mat를 구현하였다.
그리고 merge 함수를 통해 Blue_multi 와 같은 Mat에 각각 담아주었다.
(merge( , , ) 첫 번째 인자 : Mat 배열, 두 번쨰 인자 : 채널 수(배열 크기), 세 번째 인자 : output으로 받을 Mat)
Subscribe via RSS