版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sss_369/article/details/84168481
1. 直接阈值化threshold()
调用方法:
double cv::threshold(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
double thresh, // 阈值
double maxValue, // 向上最大值
int thresholdType // 阈值化操作的类型
);
基本思想:给定一个输入数组和一个阈值,数组中的每个元素将根据其与阈值之间的大小发生相应的改变。
【注】:每种阈值化操作类型,对应着源图像每点的像素值与阈值之间的比较操作,根据源图像像素值与阈值间的大小关系,目标像素可能被置0、原像素值、或者设定的最大值maxValue。
示例:
void test_threshold()
{
cv::Mat src = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat dst;
double thresh = 100;
int maxVal = 255;
cv::threshold(src, dst, thresh, maxVal, cv::THRESH_BINARY);
cv::imshow("threshold", dst);
cv::waitKey(0);
return;
}
2. 自适应阈值adaptiveThreshold()
调用方法:
void cv::adaptiveThreshold(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
double maxValue, // 向上最大值
int adaptiveMethod, // 自适应方法,平均或高斯
int thresholdType // 阈值化类型
int blockSize, // 块大小
double C // 常量
);
adaptiveThreshold()支持两种自适应方法:
ADAPTIVE_THRESH_MEAN_C(平均)和ADAPTIVE_THRESH_GAUSSIAN_C(高斯);
通过计算每个像素周围bxb大小像素块的加权均值并减去常量C得到。
如果使用平均的方法,则所有像素周围的权值相同;
如果使用高斯的方法,则(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到;
示例:
void test_adaptive_threshold()
{
cv::Mat src = cv::imread("chessboard.png", cv::IMREAD_GRAYSCALE);
cv::Mat dst;
int maxVal = 255;
int blockSize = 41;
double C = 0;
cv::adaptiveThreshold(src, dst, maxVal, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize, C);
cv::imshow("threshold", dst);
cv::waitKey(0);
return;
}
参考文章: