本文主要是介绍OpenCV学习笔记(16)图像的二值化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。与边缘检测相比,轮廓检测有时能更好的反映图像的内容,而要对图像进行轮廓检测,则必须要先对图像进行二值化,在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
threshold 方法是通过遍历灰度图中点,将图像信息二值化,处理过后的图片只有二种色值。
其函数原型如下:
double threshold (InputArray src, OutputArray dst, double thresh, double maxval, int type)
参数信息:
第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
第三个参数,double类型的thresh,阈值的具体值。
第四个参数,double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.
第五个参数,int类型的type,阈值类型,。
其它参数很好理解,我们来看看第五个参数,第五参数有以下几种类型
0: THRESH_BINARY 当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4: THRESH_TOZERO_INV 当前点值大于阈值时,设置为0,否则不改变
官方解释如下图:
示例程序:
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream> using namespace cv;
Mat SrcImage;
Mat GrayImage;
Mat BinaryImage;void on_trackbar(int pos,void*)
{//转化为二值图threshold(GrayImage, BinaryImage, pos, 255, CV_THRESH_BINARY);namedWindow("二值图");imshow("二值图", BinaryImage);
}void to_GrayImage()
{//创建与原图同类型和同大小的矩阵GrayImage.create(SrcImage.size(), SrcImage.type());//将原图转换为灰度图像cvtColor(SrcImage, GrayImage, CV_BGR2GRAY);namedWindow("灰度图");imshow("灰度图", GrayImage);}void creat_trackbar()
{int nThreshold = 0;createTrackbar("二值图阈值", "二值图", &nThreshold, 254, on_trackbar);}int main()
{SrcImage = imread("102.jpg");namedWindow("原图");imshow("原图", SrcImage);to_GrayImage();on_trackbar(1, 0);creat_trackbar();waitKey();
}
这篇关于OpenCV学习笔记(16)图像的二值化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!