阈值化

来源:互联网 发布: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