阈值化
来源:互联网 发布:linux下sleep函数 编辑:程序博客网 时间:2024/05/02 20:17
简易阈值化函数说明
选定一个阈值,可以对原图像各个像素点与阈值相比较,作出判断。
double threshold( InputArray src, OutputArray dst, double thresh, //阈值 double maxval, //目标最大像素设置值 int type //阈值化输出模式 ); 参数src: 1. 常为灰度图.使用cvtColor(src,gray,CV_RGB2GRAY);可转换为灰度图 2. 如果为三通道图片,需要先分通道再处理。使用 a. vector<Mat> mv; b. split(src,mv); //mv[0]为b通道 mv[1]为g mv[2]为r通道 c. r.create(src.size(),CV_8UC1); d. mv[2].copyTo(r); //即可获得r通道 参数thresh: 依据实际情况设定,也可以使用bar随机设定。 参数maxval: 阈值化后设置的目标图像最大像素值。 参数type: 阈值化输出图像模式。可选参数为 THRESH_BINARY=CV_THRESH_BINARY, //二值阈值化 dst=(src>T)?m:0 THRESH_BINARY_INV=CV_THRESH_BINARY_INV,//dst=(src>T)?0:M THRESH_TRUNC=CV_THRESH_TRUNC, //截断阈值化 dst=(src>T)?M:src THRESH_TOZERO=CV_THRESH_TOZERO,//低阈值化 dst=(src>T)?src:0 THRESH_TOZERO_INV=CV_THRESH_TOZERO_INV,//高阈值化 (src>T)?0:src THRESH_OTSU=CV_THRESH_OTSU //最大类间方差法 通过方差的计算来寻找一个合适的灰度级别来划分,该算法可以有效的避免图像亮度和对比度带来的影响. 对于OTSU法,因为是对图像的灰度级进行聚类,在执行该算法之前,需要计算图像的灰度直方图。
代码
#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/core/types_c.h>#include <iostream>#include <opencv.hpp>using namespace cv;using namespace std;void onBarChange(int,void*); //bar的回调函数Mat src, src_gray;Mat src_r,src_g,src_b;vector<Mat> mv; //用于存储分割的三通道图片int th_gray,th_r,th_g,th_b; //bar值记录int main(){ namedWindow("src"); namedWindow("gray"); namedWindow("r"); namedWindow("g"); namedWindow("b"); src = imread("H:\\cat.jpg"); cvtColor(src,src_gray,CV_RGB2GRAY); //转为灰度图 src_r.create(src.size(),CV_8UC1); src_g.create(src.size(),CV_8UC1); src_b.create(src.size(),CV_8UC1); split(src,mv); //将三通道图片分割为单通道 mv[0].copyTo(src_b); mv[1].copyTo(src_g); mv[2].copyTo(src_r); createTrackbar("gray","src",&th_gray,255,onBarChange); //添加bar 最大值设置为255 createTrackbar("r","src",&th_r,255,onBarChange); createTrackbar("g","src",&th_g,255,onBarChange); createTrackbar("b","src",&th_b,255,onBarChange); waitKey(0); return 0;}void onBarChange(int,void*){ Mat r,g,b,gray; //阈值化操作 模式为二值阈值化 threshold(src_gray,gray,th_gray,255,THRESH_BINARY); threshold(src_r,r,th_r,255,THRESH_BINARY); threshold(src_g,g,th_g,255,THRESH_BINARY); threshold(src_b,b,th_b,255,THRESH_BINARY); imshow("src",src); imshow("gray",gray); imshow("r",r); imshow("g",g); imshow("b",b);}
自适应阈值
针对有很强照明或反射梯度的图像,需要根据梯度进行阈值化时,自适应阈值很有用.
void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, //目标图像最大像素值 int adaptiveMethod, //自适应模式 int thresholdType, //阈值化模式 int blockSize, //自适应区域大小 double C //自适应常数 );自适应阈值化有两种模式: 由参数adaptiveMethod指定. ADAPTIVE_THRESH_MEAN_C=0, //自适应阈值T在每个像素点都不同,通过计算像素点周围的bxb(blockSize指定b)区域的加权平均,减去一个常数(c指定)得到自适应阈值。 ADAPTIVE_THRESH_GAUSSIAN_C=1 //在计算加权平均时候,在(x,y)周围的像素点依据高斯函数按照它们离中心点的距离进行加权计算。----------#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/core/types_c.h>#include <iostream>#include <opencv.hpp>using namespace cv;using namespace std;void onBarChange(int,void*); //bar的回调函数Mat src,gray;Mat th,th_adapter;int thre;int main(){ src = imread("H:\\adapter.jpg"); cvtColor(src,gray,CV_RGB2GRAY); namedWindow("src",0); namedWindow("th",0); namedWindow("adapter",0); imshow("src",src); createTrackbar("th","src",&thre,100,onBarChange); adaptiveThreshold(gray,th_adapter,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,3,5); imshow("adapter",th_adapter); waitKey(0); return 0;}void onBarChange(int,void*){ threshold(gray,th,thre,255,THRESH_BINARY); imshow("th",th);}
还有一些其他阈值方法,例如迭代法,最大熵。
0 0
- 阈值化
- 阈值化
- 阈值化
- 阈值化
- 阈值化
- 自适应阈值化 AdaptiveThreshold
- OpenCV阈值化
- opencv-阈值化处理
- 自适应阈值化方法
- 图像阈值化
- OpenCV-自适应阈值化
- 图像otsu阈值化
- Otsu阈值化
- cvThreshold() 阈值化
- 初学opencv-阈值化
- OpenCV 阈值化
- opencv-阈值化处理
- 自适应的阈值化
- pycharm中svn的使用总
- 高德地图车机版API演示程序
- 火凤凰的分的封号
- 这个patch出了之后,之前的IO manager的意义何在 = = Add hs_try_putmvar()
- 网页瀑布流布局实现方式
- 阈值化
- java 拷贝对象
- Pixhawk原生固件以往代码版本的下载
- 比较型排序与非比较型算法的总结对比
- java 远程调试
- Android中使用ALSA声卡及alsa.conf asound.conf
- ROS Learning-027 (提高篇-005 A Mobile Base-03) 控制移动平台 --- Twist 消息
- NEFU OJ16 Function Run Fun
- Pyqt5系列(五)-基本界面组件之inputDialog