目录
一、基础理论
在二维数字图像中,其每个像素点对应了不同的像素值,其像素值各不相同。可以对像素值特定范围内的图像图像进行操作,划分这个范围的值就被称为图像阈值,它不是一个固定的量级,是根据每幅图像和处理要求动态改变。例如我们可以从图像中利用阈值分割出我们需要的部分。
例:
1.二进制阈值化
在运用二进制阈值化操作时,首先指定一个阈值量即像素的灰度值,遍历图像中像素值,大于这个阈值的像素均设置为最大像素值(如8位灰度值最大为255),灰度值小于设定阈值的像素点像素值重新赋值为0.得到如下图所示图像,借用二进制概念。(超过该阈值即为1(255),否则为0)
2.反二进制阈值化
反二进制阈值化顾名思义就是与第一个阈值化类型相反。
与二进制阈值化相同的是也要首先指定一个阈值,不同的是在对图像进行阈值化操作时正好与二进制阈值化相反,当图像像素点超过这个阈值的时候像素点重新赋值为0,当像素值低于该阈值时即赋值为最大值。(低于该阈值即为1(255),否则为0)
3.截断阈值化
根据给定的像素值阈值,图像中大于该阈值的像素点被重新设置为该阈值,而小于该阈值的像素值保持不变。(超过阈值部分设置为阈值)
4.阈值化为0
与截断阈值化不同,阈值化为0类型像素点的灰度值如果大于该阈值则像素值不变,如果像素点的灰度值小于该阈值,则像素值设置为0。(不足阈值部分设置为0)
5.反阈值化为0
其原理类似于阈值化为0类型只不过在对图像进行操作时相反,像素值大于该阈值的像素重新赋值为0,而小于该阈值的像素值则保持不变,(超过阈值部分设置为0)
函数
threshold(gray, dst, threshold_value, threshold_max, type);
// 阈值 最大值 类型
类型:
代码
//基本阈值操作
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
Mat src, gray, dst;
int threshold_value = 127;
int threshold_max = 255;
int type = 2;
int type_max = 4;
char name[] = "result";
void Callback_Thre(int, void*); //回调函数
void Image_Init()
{
src = imread("Resource/test.jpg");
if (!src.data)
{
printf("could not load image...\n");
return ;
}
imshow("原图", src);
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("GRAY", gray);
}
int main(int argc, int argv)
{
Image_Init();
Callback_Thre(0, 0);
createTrackbar("threshold value", name, &threshold_value, threshold_max, Callback_Thre);
createTrackbar("threshold type", name, &type, type_max, Callback_Thre);
waitKey(0);
return 0;
}
//阈值化实现函数
void Callback_Thre(int, void*)
{
//阈值化(自主定义阈值)
threshold(gray, dst, threshold_value, threshold_max, type);
//阈值化(系统帮忙取,大津法OTSU:THRESH_OTSU;三角形阈值法:THRESH_TRIANGLE)
//threshold(gray, dst, 0, 255, THRESH_OTSU | type);
imshow(name, dst);
}
效果