OpenCV实现彩色图像转换为灰度图及二值化处理
环境win10+vs2019+OpenCV4.5.1
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <opencv2\imgproc\types_c.h>
using namespace cv;
Mat SrcImage; //创建三个图像
Mat GrayImage;
Mat BinaryImage;
/*
* 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,否则不改变
*/
void on_trackbar(int pos, void*)
{
//转化为二值图
threshold(GrayImage, BinaryImage, pos, 255, CV_THRESH_BINARY);
namedWindow("二值图");
imshow("二值图", BinaryImage);
}
/*
*
图像的灰度化即是将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。
彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,
这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。
而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,
所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。
灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。
*/
/*
cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),
并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。
void cv::cvtColor(
cv::InputArray src, // 输入序列
cv::OutputArray dst, // 输出序列
int code, // 颜色映射码
int dstCn = 0 // 输出的通道数 (0='automatic')
);
参数解释:
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定
*/
void to_GrayImage()
{
//创建与原图同类型和同大小的矩阵
GrayImage.create(SrcImage.size(), SrcImage.type());
//将原图转换为灰度图像
cvtColor(SrcImage, GrayImage, CV_BGR2GRAY);
namedWindow("灰度图");
imshow("灰度图", GrayImage);
}
/*
* createTrackbar是Opencv中的API,其可在显示图像的窗口中快速创建一个滑动控件,用于手动调节阈值,具有非常直观的效果。具体定义如下:
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
形式参数一、trackbarname:滑动空间的名称;
形式参数二、winname:滑动空间用于依附的图像窗口的名称;
形式参数三、value:初始化阈值;
形式参数四、count:滑动控件的刻度范围;
形式参数五、TrackbarCallback是回调函数,其定义如下:
typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);
如此,即可在图像窗口上方成功创建一个滑动控件
*/
void creat_trackbar()
{
// 滑动条
int nThreshold = 0;
createTrackbar("二值图阈值", "二值图", &nThreshold, 254, on_trackbar);
}
int main()
{
SrcImage = imread("d:\\images\\im.jpg");
namedWindow("原图");
imshow("原图", SrcImage);
to_GrayImage();
on_trackbar(100, 0);
creat_trackbar();
waitKey();
}