自适应阈值(adaptiveThreshold)分割原理及实现
背景介绍及原理
前面介绍了OTSU算法和最大熵算法,但这两种算法都属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图:
显然,这样的阈值处理结果不是我们想要的,那么就需要一种方法来应对这样的情况。
这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)
如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值。值得说明的是:如果用局部的均值作为局部的阈值,就是常说的移动平均法(听起来挺高大上,其实......逃)。
OpenCV提供的API:
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,int adaptiveMethod, int thresholdType, int blockSize, double C)
说明下各参数:
InputArray src:源图像
OutputArray dst:输出图像,与源图像大小一致
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值。
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值。
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 具体的请看官方的说明,这里不多做解释。
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。
double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。
注:相比OpenCV的API,我多用了一个中值法确定阈值。
基于OpenCV实现
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>enum adaptiveMethod{meanFilter,gaaussianFilter,medianFilter};void AdaptiveThreshold(cv::Mat& src, cv::Mat& dst, double Maxval, int Subsize, double c, adaptiveMethod method = meanFilter){if (src.channels() > 1)cv::cvtColor(src, src, CV_RGB2GRAY);cv::Mat smooth;switch (method){case meanFilter:cv::blur(src, smooth, cv::Size(Subsize, Subsize)); //均值滤波break;case gaaussianFilter:cv::GaussianBlur(src, smooth, cv::Size(Subsize, Subsize),0,0); //高斯滤波break;case medianFilter:cv::medianBlur(src, smooth, Subsize); //中值滤波break;default:break;}smooth = smooth - c;//阈值处理src.copyTo(dst);for (int r = 0; r < src.rows;++r){const uchar* srcptr = src.ptr<uchar>(r);const uchar* smoothptr = smooth.ptr<uchar>(r);uchar* dstptr = dst.ptr<uchar>(r);for (int c = 0; c < src.cols; ++c){if (srcptr[c]>smoothptr[c]){dstptr[c] = Maxval;}elsedstptr[c] = 0;}}}int main(){cv::Mat src = cv::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)cv::cvtColor(src, src, CV_RGB2GRAY);cv::Mat dst, dst2;double t2 = (double)cv::getTickCount();AdaptiveThreshold(src, dst, 255, 21, 10, meanFilter); //t2 = (double)cv::getTickCount() - t2;double time2 = (t2 *1000.) / ((double)cv::getTickFrequency());std::cout << "my_process=" << time2 << " ms. " << std::endl << std::endl;cv::adaptiveThreshold(src, dst2, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 21, 10);cv::namedWindow("src", CV_WINDOW_NORMAL);cv::imshow("src", src);cv::namedWindow("dst", CV_WINDOW_NORMAL);cv::imshow("dst", dst);cv::namedWindow("dst2", CV_WINDOW_NORMAL);cv::imshow("dst2", dst2);//cv::imwrite("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Image Filtering\\MeanFilter\\TXT.jpg",dst);cv::waitKey(0);
}
效果
这个效果就好很多了。
自适应阈值(adaptiveThreshold)分割原理及实现相关推荐
- 【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】
⛄一.一种基于直方图的实时自适应阈值分割方法简介 1 引言 在交通管理中,为了获得车辆的运动数据,需要对交通视频进行实时监测,从监测图像序列中检测出运动对象,并对运动对象进行分析处理,从而获得车辆和行 ...
- OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)
OpenCV与图像处理学习七--传统图像分割之阈值法(固定阈值.自适应阈值.大津阈值) 一.固定阈值图像分割 1.1 直方图双峰法 1.2 OpenCV中的固定阈值分割 二.自动阈值图像分割 2.1 ...
- 7.1 Python图像处理之图像分割-自适应阈值
7.1 Python图像处理之图像分割-自适应阈值 文章目录 7.1 Python图像处理之图像分割-自适应阈值 1 算法原理 2 代码 3 效果 1 算法原理 在不均匀照明或者灰度值分布不均的情况下 ...
- OpenCV自适应阈值分割函数:adaptiveThreshold()介绍
OpenCV自适应阈值分割函数:adaptiveThreshold()介绍 [注意] 1. adaptiveThreshold()函数的ThresholdTypes参数只能设置为"CV_TH ...
- OpenCV自适应阈值化函数adaptiveThreshold详解,并附实例源码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 2016-6-14日:又发现一种阈值分割法,最大 ...
- 图像二值化方法及适用场景分析(OTSU Trangle 自适应阈值分割)
图像二值化 应用场景 二值图像定义 阈值获取的方法 手动阈值法 自动阈值法 灰度均值法 基于直方图均值法 OTSU Triangle 自适应均值阈值分割方法 总结 参考文献 应用场景 二值图像处理与分 ...
- Python-OpenCV自适应阈值图像处理使用adaptiveThreshold函数获取图像轮廓
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<OpenCV阈值处理函数threshold处理32位彩色图像的案例>介绍了threshold 函数,但threshold 的图像阈值 ...
- OpenCV —— 阈值分割(直方图技术法,熵算法,Otsu,自适应阈值算法)
阈值分割 1. 全局阈值分割 直方图技术法 熵算法 Otsu算法 2. 局部阈值分割 自适应阈值 阈值的分割的核心就是如何选取阈值,选取正确的阈值时分割成功的关键.可以使用手动设置阈值,也可以采用直方 ...
- 自适应阈值化操作:adaptiveThreshold()函数
在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果.而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样 ...
最新文章
- Python字符编码详解
- 开源wkhtmltopdf使用心得 (四)
- 国外的开源的CMS汇总(转载)
- 面向对象的特点封装、继承、多态
- Java Review - PriorityQueue源码解读
- OFDM同步算法之Park算法
- mysql explain理解
- 单元格格式_单元格格式的用法你知道吗~~
- 在危机中呈现转机的网络管理
- 借助 Clay 编写 不可思议 的 c# 代码
- PHP通用网站后台管理系统
- 数据库变为可疑_SQL Server 2008R2 数据库出现“可疑”导致无法访问解决办法
- ruby on rails_通过Ruby on Rails中的关系调试Has_Many
- 慕测安居客功能测试答案
- 高并发服务端分布式系统设计概要
- 如何改变alert的默认样式
- SML-Rangelab
- python文件另存为快捷键_Word文件另存为快捷键ctrl加什么?
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- Ubuntu的docker详细安装教程
热门文章
- c语言编程数组例题,c语言编程有关数组的几道例题.docx
- 现代C++新特性 强枚举类型(PC浏览效果更佳)
- 刷题之路:DP思想(动态规划)
- SLAM笔记(六)直接法介绍
- 嵌入式与通用计算机的相同点,嵌入式计算机与通用计算机的区别与联系
- Java 后端开发学习型网站汇总
- 安卓应用软件开发必学的基础内容
- No MyBatis mapper was found in '[com.briup.demo]' package. Please check your
- 2020美团秋招笔试题解
- 微信小程序实现展示图片(图片推广小程序可以使用)