Recent Posts
printf("ho_tari\n");
Chapter 11 : 이진화와 모폴로지 본문
<OpenCV_Projects.cpp>
#include <opencv2/opencv.hpp>
extern void using_threshold();
extern void adaptive_threshold();
extern void erode_dilate();
extern void open_close();
int main()
{
//using_threshold();
//adaptive_threshold();
//erode_dilate();
open_close();
}
<using_threshold.cpp>
#pragma once
#include <opencv2/opencv.hpp>
static void on_threshold(int position, void* userdata)
{
cv::Mat src = *(static_cast<cv::Mat*>(userdata));
cv::Mat dst;
cv::threshold(src, dst, position, 255.0, cv::THRESH_BINARY);
cv::imshow("DST", dst);
}
void using_threshold()
{
cv::Mat src = cv::imread("neutrophils.png", 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("Threshold", "DST", 0, 255, on_threshold, (void*)&src);
cv::setTrackbarPos("Threshold", "DST", 128);
cv::waitKey();
cv::destroyAllWindows();
}
<compile 결과>
<adaptive_threshold.cpp>
#pragma once
#include <opencv2/opencv.hpp>
static void on_trackbar(int position, void* userdata)
{
cv::Mat src = *(static_cast<cv::Mat*>(userdata));
if (position % 2 == 0) --position; // 짝수이면 1개를 빼서 홀수로 만든다
int block_size = position;
if (block_size < 3) block_size = 3; // 블록사이즈가 3보다 작으면 3으로 설정
cv::Mat dst;
cv::adaptiveThreshold(src, dst, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, block_size, 5.0); // C 보통 5를 씀
cv::imshow("DST", dst);
}
void adaptive_threshold()
{
cv::Mat src = cv::imread("sudoku.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty()) return;
cv::namedWindow("DST", cv::WINDOW_NORMAL);
cv::namedWindow("SRC", cv::WINDOW_NORMAL);
cv::imshow("SRC", src);
cv::createTrackbar("Blocksize", "DST", nullptr, 200, on_trackbar, (void*)&src);
cv::setTrackbarPos("Blocksize", "DST", 11);
cv::waitKey();
cv::destroyAllWindows();
<compile 결과>
<erode_dilate.cpp>
#pragma once
#include <opencv2/opencv.hpp>
void erode_dilate()
{
cv::Mat src{ cv::imread("milkdrop.bmp", cv::IMREAD_GRAYSCALE) };
if (src.empty()) return;
/*
* 영상의 이진화 -> threshold()
*/
cv::Mat binary_image;
cv::threshold(src, binary_image, 0.0 /*OTSU*/, 255.0, cv::THRESH_BINARY | cv::THRESH_OTSU);
cv::Mat dst_erode;
cv::erode(binary_image, dst_erode, cv::Mat()/*3X3*/);
for (int i = 0; i < 5; ++i)
{
cv::erode(dst_erode, dst_erode, cv::Mat()/*3X3*/);
cv::imshow("Erode", dst_erode);
cv::waitKey();
}
cv::Mat dst_dilate;
cv::dilate(binary_image, dst_dilate, cv::Mat()); // 3X3
for (int i = 0; i < 5; ++i)
{
cv::dilate(dst_dilate, dst_dilate, cv::Mat());
cv::imshow("Dilate", dst_dilate);
cv::waitKey();
}
cv::destroyAllWindows();
}
<compile 결과>
<open_close.cpp>
#pragma once
#include <opencv2/opencv.hpp>
void open_close()
{
cv::Mat src = cv::imread("milkdrop.bmp", cv::IMREAD_GRAYSCALE);
if (src.empty()) return;
cv::Mat binary_image;
cv::threshold(src, binary_image, 0.0, 255.0, cv::THRESH_BINARY | cv::THRESH_OTSU);
cv::Mat dst_open;
cv::Mat dst_close;
cv::morphologyEx(binary_image, dst_open, cv::MORPH_OPEN, cv::Mat(), cv::Point(-1, -1), 5);
cv::morphologyEx(binary_image, dst_close, cv::MORPH_CLOSE, cv::Mat(), cv::Point(-1, -1), 5);
cv::imshow("SRC", src);
cv::imshow("Binary", binary_image);
cv::imshow("DST_OPEN", dst_open);
cv::imshow("DST_CLOSE", dst_close);
cv::waitKey();
cv::destroyAllWindows();
}
<compile 결과>
'OpenCV' 카테고리의 다른 글
Chapter 15 : 머신 러닝 (0) | 2023.09.18 |
---|---|
Examples (0) | 2023.09.18 |
Chapter 10 : 컬러 영상 처리 (0) | 2023.09.18 |
Chapter 9 : 에지 검출과 응용 (0) | 2023.09.18 |
Chapter 8 : 영상의 기하학적 변환 (0) | 2023.09.18 |