自适应阈值(adaptiveThreshold)分割原理及实现
均值阈值法:计算某个邻域(局部区域)的平均值,并与给定常数 ( C ) 做偏移,得到局部的阈值。 高斯加权平均法:类似均值法,但采用了高斯滤波对局部区域进行加权平均,能够更有效地平滑图像,减少噪声的影响。 中值法:使用中值滤波算法,选择局部区域的中值作为阈值。 InputArray src:输入图像。 OutputArray dst:输出图像,与输入图像大小一致。 double maxValue:最大值,用于二值化操作。 int adaptiveMethod:决定阈值计算方法的参数: int thresholdType:阈值类型: int blockSize:局部邻域的大小,常用值为3、5、7等。 double C:偏移值,用于调整阈值。 AdaptiveThreshold函数:这是自适应阈值法的核心函数,接收源图像和多个参数,返回处理后的图像。 图像转换:如果输入图像是彩色图,使用 滤波处理:根据传入的参数选择不同的滤波方法(均值滤波或高斯滤波),生成平滑后的图像。 偏移调整:将滤波后的图像与常数 ( C ) 做减法,得到最终的阈值图像。 二值化处理:将源图像和阈值图像进行二值化处理,得到最终的自适应阈值图像。
发布日期:2025-06-18 16:52:58
浏览次数:3
分类:精选文章
本文共 2951 字,大约阅读时间需要 9 分钟。
自适应阈值法:解决光照不均图像分割的难题
在图像处理领域,OTSU算法和最大熵算法作为全局阈值分割的代表方法,虽然在许多场景下表现出色,但在面对光照不均(阴影、亮斑等)的图像时往往显得力不从心。这种现象在实践中经常出现,如下图所示:
此类问题的根本原因在于传统的全局阈值方法无法有效捕捉到图像局部的亮度变化特征。这种局限性促使我们探索一种更加灵活的解决方案——自适应阈值法。
自适应阈值法的核心思想
自适应阈值法(Adaptive Thresholding)与传统的全局阈值法有着本质的区别:它不是基于整个图像计算固定的阈值,而是根据图像不同区域的亮度分布,自适应地为每个局部区域计算最优的阈值。这种方法能够更好地适应复杂的光照条件,解决传统方法在处理光照不均图像时的不足。
具体而言,自适应阈值法通过以下方法实现局部阈值的计算:
值得注意的是,虽然均值法看似简单,但其在实践中表现出色,尤其在处理光照不均问题时能够提供较好的视觉效果。
OpenCV中的自适应阈值法实现
OpenCV为开发者提供了丰富的API来实现自适应阈值法,以下是相关函数的说明:
void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);
参数说明
ADAPTIVE_THRESH_MEAN_C:使用均值法加偏移。ADAPTIVE_THRESH_GAUSSIAN_C:使用高斯加权平均法加偏移。
THRESH_BINARY:二值化处理(阈值以上设为最大值,以下设为0)。THRESH_BINARY_INV:取反后的二值化处理。
代码实现
以下是一个基于OpenCV实现自适应阈值法的示例代码:
#include#include using namespace cv;using namespace std;void AdaptiveThreshold(Mat& src, Mat& dst, double Maxval, int Subsize, double c) { if (src.channels() > 1) { cvtColor(src, src, CV_BGR2GRAY); } // 选择不同的滤波方法 Mat smooth; if (c == 0) { blur(src, smooth, Size(Subsize, Subsize)); } else { GaussianBlur(src, smooth, Size(Subsize, Subsize), 0, 0); } // 偏移调整 smooth -= c; // 复制原图并应用阈值处理 src.copyTo(dst); for (int r = 0; r < src.rows; ++r) { const uchar* srcPtr = src.ptr(r); const uchar* smoothPtr = smooth.ptr(r); uchar* dstPtr = dst.ptr(r); for (int c = 0; c < src.cols; ++c) { if (srcPtr[c] > smoothPtr[c]) { dstPtr[c] = Maxval; } else { dstPtr[c] = 0; } } }}int main() { Mat src = imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\Fig1049(a)(spot_shaded_text_image).tif"); if (src.empty()) { return -1; } if (src.channels() > 1) { cvtColor(src, src, CV_BGR2GRAY); } // 生成自适应阈值图像 Mat dst, dst2; AdaptiveThreshold(src, dst, 255, 21, 10); cv::adaptiveThreshold(src, dst2, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 21, 10); // 显示图像 namedWindow("src", CV_WINDOW_NORMAL); imshow("src", src); namedWindow("dst", CV_WINDOW_NORMAL); imshow("dst", dst); namedWindow("dst2", CV_WINDOW_NORMAL); imshow("dst2", dst2); waitKey(0); return 0;}
代码解释
cv::cvtColor将其转换为灰度图,以便后续处理。效果展示
通过上述方法,处理后的图像效果显著改善,如下图所示:
此方法在处理光照不均图像时,能够更好地保留细节信息,显著提升了图像的视觉质量。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2026年06月16日 06时22分42秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
R2学习记录
2023-03-01
PHP获取本周的每一天的时间
2023-03-01
php获取用户真实IP和防刷机制
2023-03-01
php获取网页内容的三种方法
2023-03-01
R-CNN算法优化策略
2023-03-01
PHP规范PSR0和PSR4的理解
2023-03-01
php解析ipa包,获取logo
2023-03-01
R&Rstudio安装各种包
2023-03-02
php设置cookie,在js中如何获取
2023-03-02
php设置socket超时时间
2023-03-02
php设计模式 萨莱 pdf,PHP设计模式 建造者模式
2023-03-02
PHP设计模式之----观察者模式
2023-03-02
php设计模式之装饰器模式
2023-03-02
R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)
2023-03-02
PHP设计模式:观察者模式
2023-03-02
php访问mysql(1)
2023-03-02
php详细学习1
2023-03-02
php语言优劣
2023-03-02
PHP语言最优雅的支付SDK扩展包
2023-03-02
PHP请求https域名发生segment fault段错误
2023-03-02