图形算法与实战:2.分割专题 (1) 阈值分割

1 阈值分割

目录

1 阈值分割

1.1 图像处理效果展示

1.1.1 固定阈值分割效果展示

1.1.2 自适应阈值分割效果展示

1.2 阈值分割原理

1.2.1 固定阈值分割原理

1.2.2 自适应阈值分割原理

1.3 代码展示

1.3.1 固定阈值分割代码

1.3.2 自适应阈值分割代码


1.1 图像处理效果展示

1.1.1 固定阈值分割效果展示

处理前

原图

处理后

THRESH_BINARY方法

THRESH_BINARY_INV方法

THRESH_TRUNC方法

THRESH_TOZERO方法

THRESH_TOZERO_INV方法

1.1.2 自适应阈值分割效果展示

处理前

原图

处理后

gaussian方法:对应参数为ADAPTIVE_THRESH_GAUSSIAN_C

mean方法:对应参数为ADAPTIVE_THRESH_MEAN_C

1.2 阈值分割原理

1.2.1 固定阈值分割原理

1.2.2 自适应阈值分割原理

1.3 代码展示

1.3.1 固定阈值分割代码

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat srcImage = imread("C:\\Users\\SYYSP\\Desktop\\dinisha.jpg");
	imshow("原图", srcImage);
	if (!srcImage.data)
	{
		cout << "fail to load image" << endl;
		return 0;
	}

	Mat dstImage1, dstImage2, dstImage3, dstImage4, dstImage5;
	double thresh = 100;
	int maxVal = 255;

	cv::threshold(srcImage, dstImage1, thresh, maxVal, cv::THRESH_BINARY);
	//imshow("THRESH_BINARY", dstImage1);
	imwrite("C:\\Users\\SYYSP\\Desktop\\THRESH_BINARY.jpg", dstImage1);

	cv::threshold(srcImage, dstImage2, thresh, maxVal, cv::THRESH_BINARY_INV);
	//imshow("THRESH_BINARY_INV", dstImage2);
	imwrite("C:\\Users\\SYYSP\\Desktop\\THRESH_BINARY_INV.jpg", dstImage2);

	cv::threshold(srcImage, dstImage3, thresh, maxVal, cv::THRESH_TRUNC);
	//imshow("THRESH_TRUNC", dstImage3);
	imwrite("C:\\Users\\SYYSP\\Desktop\\THRESH_TRUNC.jpg", dstImage3);

	cv::threshold(srcImage, dstImage4, thresh, 150, cv::THRESH_TOZERO);
	//imshow("THRESH_TOZERO", dstImage4);
	imwrite("C:\\Users\\SYYSP\\Desktop\\THRESH_TOZERO.jpg", dstImage4);

	cv::threshold(srcImage, dstImage5, thresh, 150, cv::THRESH_TOZERO_INV);
	//imshow("THRESH_TOZERO", dstImage5);
	imwrite("C:\\Users\\SYYSP\\Desktop\\THRESH_TOZERO_INV.jpg", dstImage5);


	//cout << dstImage1 << endl;

	waitKey(0);
	return 0;
}

1.3.2 自适应阈值分割代码

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat srcImage = imread("C:\\Users\\SYYSP\\Desktop\\dajian.jpg", cv::IMREAD_GRAYSCALE);
	//自适应阈值函数只能处理单通道灰度图像,如果三通道会出错
	imshow("原图", srcImage);
	if (!srcImage.data)
	{
		cout << "fail to load image" << endl;
		return 0;
	}

	Mat dstImage1, dstImage2;
	double maxVal = 255;
	int blockSize = 41;
	double C = 20;
	cv::adaptiveThreshold(srcImage, dstImage1, maxVal, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize, C);
	//imshow("mean", dstImage1);
	imwrite("C:\\Users\\SYYSP\\Desktop\\mean.jpg", dstImage1);

	cv::adaptiveThreshold(srcImage, dstImage2, maxVal, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, blockSize, C);
	//imshow("gaussian", dstImage2);
	imwrite("C:\\Users\\SYYSP\\Desktop\\gaussian.jpg", dstImage2);

	waitKey(0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_32391345/article/details/106760384