C++을 이용한 OpenCV(6)

런치·2023년 10월 4일
0

C++

목록 보기
9/14
post-thumbnail

Hue (색상), Saturation (채도) 및 Value (명도) 정보 분리

#pragma once
#include <opencv2/opencv.hpp>

void color_split() {
	cv::Mat src = cv::imread("candies.png");
	cv::Mat dst(src.size(), src.type());
	std::vector<cv::Mat>hsv_planes;
	cv::cvtColor(src, dst, cv::COLOR_BGR2HSV);
	cv::split(dst, hsv_planes);
	cv::imshow("SRC", src);
	cv::imshow("DST", dst);
	cv::imshow("H", hsv_planes[0]);
	cv::imshow("S", hsv_planes[1]);
	cv::imshow("V", hsv_planes[2]);
	cv::waitKey();
	cv::destroyAllWindows();
}

임계값 처리(Threshhold)

바이너리 이미지(binary image)란 검은색과 흰색만으로 표현한 이미지를 만드는 방법으로,
여러 값을 어떤 임계점을 기준으로 두 가지 부류로 나누는 방법을 의미

static void on_threshhold(int position, void* userdata) {
	cv::Mat src = *(static_cast<cv::Mat*>(userdata));
	cv::Mat dst;
}
void using_threshhold() {
	cv::Mat src = cv::imread("sudoku.jpg", cv::IMREAD_GRAYSCALE);
	if (src.empty())return;
	cv::namedWindow("SRC", cv::WINDOW_NORMAL);
	cv::namedWindow("DST", cv::WINDOW_NORMAL);
	cv::imshow("SRC", src);
	cv::createTrackbar("Threshhold", "DST", 0, 255, on_threshhold, (void*)&src);
	cv::setTrackbarPos("Threshhold", "DST", 128);
	cv::waitKey();
	cv::destroyAllWindows();

}

트랙바 설정

static void on_trackbar(int position, void* userdata) {
	cv::Mat src = *(static_cast<cv::Mat*>(userdata));
	int block_size = position;
	if (position % 2 == 0) --position;
	if (block_size < 3) block_size = 3;
	cv::Mat dst;
	cv::adaptiveThreshold(src, dst, 255, \
		cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, block_size, 5.0);
	cv::imshow("DST", dst);
}

적응 임계값 처리

void adapative_threshhold() {
	cv::Mat src = cv::imread("sudoku.jpg", cv::IMREAD_GRAYSCALE);
	if (src.empty())return;
	cv::namedWindow("DST",cv::WINDOW_NORMAL);
	cv::createTrackbar("BlockBuster", "DST", nullptr, 200, on_trackbar, (void*)&src);
	cv::setTrackbarPos("Blocksize", "DST", 11);
	cv::waitKey();
	cv::destroyAllWindows();
}

이미지 침식 & 팽창

void erode_dilate() {
	cv::Mat src{ cv::imread("milkdrop.bmp", cv::IMREAD_GRAYSCALE) };
	if (src.empty())return;
	cv::imshow("SRC", src);
	cv::Mat binary_img;
	cv::threshold(src, binary_img, 0.0,/*0.0 = for "OTSU" */255.0, cv::THRESH_BINARY | cv::THRESH_OTSU);
	cv::Mat dst_erode;
	cv::erode(binary_img, dst_erode, cv::Mat());//DEFAULT 3x3
	for (int i = 0; i < 5; ++i) {
		cv::erode(dst_erode, dst_erode, cv::Mat());
		cv::imshow("ERODE",dst_erode);
		cv::waitKey();
	}
	cv::Mat dst_dilate;
	cv::dilate(binary_img, dst_dilate, cv::Mat());
	for (int i = 0; i < 5; ++i) {
		cv::dilate(dst_dilate, dst_dilate, cv::Mat());
		cv::imshow("DILATE", dst_dilate);
		cv::waitKey();
	}
	cv::destroyAllWindows();
}

오프닝 & 클로징 기법

  1. Opening : 연결된 부분을 끊어주는 것, 침식연산 이후 팽창연산으로 구현
  2. Closeing : 끊겨있는 부분을 이어주는 것, 팽창연산 이후 침식연산으로 구현
void open_close() {
	cv::Mat src = cv::imread("milkdrop.bmp", cv::IMREAD_GRAYSCALE);
	if (src.empty())return;
	cv::Mat binary_img;
	cv::threshold(src, binary_img, 0.0, 255.0, cv::THRESH_BINARY | cv::THRESH_OTSU);
	cv::Mat dst_open;
	cv::Mat dst_close;
	cv::morphologyEx(binary_img, dst_open, cv::MORPH_OPEN, cv::Mat(),cv::Point(-1,-1),5);
	cv::morphologyEx(binary_img, dst_close, cv::MORPH_CLOSE, cv::Mat(), cv::Point(-1, -1), 5);
	cv::imshow("SRC", src);
	cv::imshow("B_IMG", binary_img);
	cv::imshow("DST_OPEN", dst_open);
	cv::imshow("DST_CLOSE", dst_close);
	cv::waitKey();
	cv::destroyAllWindows();
}
profile
점심을 안먹음

0개의 댓글