printf("ho_tari\n");

Chapter 11 : 이진화와 모폴로지 본문

OpenCV

Chapter 11 : 이진화와 모폴로지

호타리 2023. 9. 18. 11:16

<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