数字图像处理最主要的就是对像素进行操作,然而Opencv提供了14中像素的操作方法,但是处理速度有所不一样,常用的可以用指针进行访问,本文采用的也是用指针进行访问,其次可以采用vector容器指针的方式进行访问,处理速度上也很快! 基本上如果学会了对像素的操作就可以结合《数字图像处理》一书根据相应理论公式编写相关算法,正如学习stm32嵌入式时,首先学会 的既是对I/O口的操作;之前都是通过调用相关api函数实现的,今天刚好不想看书就想自己写点代码测试一下自己的学习的进程以及理解程度。然后就编写了一个基于两个阈值的二值化图像算法。
Code:
/*
*作者:att0206
*地点:上海师范大学
*时间:2017/03/26
*功能:二值化图像的学习
*/
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#define WINDOW_NAME1 "srcImage"
#define WINDOW_NAME2 "dstImage"
#define TrackbarValueMax 255
using namespace std;
using namespace::cv;
Mat srcImage;
Mat dstImage;
int TrackbatValue = NULL;
int TrackbatValue1 = NULL;
static void showHelpText();
void showerror(Mat&);
void XS(Mat&rstImage,Mat&dstImage);
static void on_EZ(int,void* );
int main(int argc,char* argv[])
{
system("color 3F");
showHelpText();
TrackbatValue =100;
TrackbatValue1 = 150;
srcImage = imread("dota.jpg");
showerror(srcImage);
cvtColor(srcImage,srcImage,CV_BGR2GRAY);
while(1)
{
imshow(WINDOW_NAME1,srcImage);
namedWindow(WINDOW_NAME2); //必须创建一个WINDOW_NAME2的窗口,这样Trackbar才可以依附
createTrackbar("阈值:",WINDOW_NAME2,&TrackbatValue,TrackbarValueMax,on_EZ);
createTrackbar("阈值",WINDOW_NAME2,&TrackbatValue1,TrackbarValueMax,on_EZ);
on_EZ(TrackbatValue1,0);
on_EZ(TrackbatValue,0);
//XS(srcImage,dstImage);
//imshow(WINDOW_NAME2,dstImage);
waitKey(11);
}
return NULL;
}
static void showHelpText()
{
cout<<"***********************************************\n\n"<<endl;
cout<<"***** 欢迎学习opencv *****\n\n"<<endl;
cout<<"*********** ****** ***********\n"<<endl;
}
void showerror(Mat&srcImage)
{
if(!srcImage.data)
cout<<"error:请查看project下是否存在文件!"<<endl;
else
{
cout<<"success:打开文件成功"<<endl;
}
}
void XS(Mat&srcImage,Mat& dstImage) //二值化处理数据 一般前景与背景有很大的差异时比较明显
{
dstImage = srcImage.clone();
int row = dstImage.rows; //行
int col = dstImage.cols; //列
for(int x = 0;x<row;x++)
{
uchar* data = dstImage.ptr<uchar>(x); //获取第x行的头指针
for(int y = 0;y<col;y++)
{
int num = (int)data[y]; //强制转换为整型数据和阈值进行比较
if((num>TrackbatValue)&(num<TrackbatValue1))
data[y] = 255; //
else
data[y] = 0;
//cout<<"num is :"<<num<<endl;
}
}
}
static void on_EZ(int,void*) //回调函数
{
XS(srcImage,dstImage);
imshow(WINDOW_NAME2,dstImage);
}
Output: