#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();
}
바이너리 이미지(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();
}
- Opening : 연결된 부분을 끊어주는 것, 침식연산 이후 팽창연산으로 구현
- 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();
}