首先感谢博客园的
Madcola博主,他给了我很多启发,也让我深受鼓舞,我的opencv系列博客都是受他启发而写。大家感兴趣的可以也去关注一下这位博主
#include
#include
#include
using namespace std;
using namespace cv;
#define PIC_MAX_NUM 5
int pic_num = 1;
void on_track(int, void*)
{
char file[10];
sprintf(file, "jack%d.jpg", pic_num);
Mat img = imread(file);
if (img.empty())
{
cout << "ERROR" << endl;
return;
}
imshow("Display",img);
}
void main()
{
/*
//腐蚀操作
Mat SrcPic = imread("jack.jpg");
//getStructuringElement返回指定的形状和尺寸的结构元素
//锚点:就是处理之后的结果值的保存位置,该位置称为"锚点 ",有时候也不在中心。
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
Mat dstpic;
erode(SrcPic,dstpic,element);
imshow("dst",dstpic);
*/
//------------------------------------------------------------------
/*
//使用blur均值滤波实现图像模糊
//
Mat src = imread("jack.jpg");
Mat dsr;
blur(src,dsr,Size(20,20));
imshow("均值滤波",dsr);
*/
//------------------------------------------------------------------
/*
//使用canny算子进行边缘检测
Mat src = imread("jack.jpg");
Mat dst, edge, gray;
//创建与src同类型同大小的矩阵
dst.create(src.size(),src.type());
//将原图像转换为灰度图
cvtColor(src,gray,CV_BGR2GRAY);
//s使用3*3的内核进行均值滤波
blur(gray,edge,Size(3,3));
Canny(edge,edge,3,100,3);
imshow("edge",edge);
*/
//------------------------------------------------------------------
/*
//使用trackbar打开多张图片(有问题)
namedWindow("展示多张图片",WINDOW_NORMAL);
createTrackbar("Img_ID","Display multi img",&pic_num, PIC_MAX_NUM, on_track);
on_track(pic_num,NULL);
*/
//------------------------------------------------------------------
//转化为灰度图
/*
Mat img = imread("jack1.jpg");
Mat grat;
cvtColor(img,grat,CV_RGB2GRAY);
imshow("gray", grat);*/
//------------------------------------------------------------------
/*
//常见用法
//Iplimg 转化为Mat
IplImage *img = cvLoadImage("jack.jpg");
Mat mat = cvarrToMat(img);
//Mat转换为Iplimg
IplImage img2 = IplImage(mat);
//或者
Mat m2;
m2.create(4,4,CV_8UC3);
//point 表示点的x和y坐标
Point p;
p.x = 1;
p.y = 2;
Point p2(1,3);
//尺寸表示:Size
Size(5,5);//表示5行5列
//访问图像中像素的方式
Mat img3 = imread("jack1.jpg");
for (int i = 0; i(i);
for (int j = 0; j < img3.cols; j++)
{
printf("%d
",data[j]);
}
}
*/
//------------------------------------------------------------------
//直方图均衡化
Mat img = imread("jack1.jpg");
Mat dst;
cvtColor(img, img,CV_RGB2GRAY);
imshow("img", img);
equalizeHist(img,dst);
imshow("dst",dst);
waitKey(0);
system("pause");
return;
}
总结一下图像处理中的常用操作和处理代表的含义
1:傅里叶变化后,高频代表图像中的细节和纹理信息;低频部分代表边缘和轮廓信息。
2:所以对应的低通滤波其实就是模糊化;高通滤波就是增强对比度,锐化图像,增强图像的纹理信息。
3:膨胀和腐蚀操作是针对图像的白 {MOD}(高亮)部分来进行的,膨胀后高亮部分更加高亮;腐蚀操作以后,高亮部分变小
开运算----先腐蚀再膨胀(消除小物体)
闭运算----先膨胀再腐蚀(消除小型黑洞)
4:形态学梯度:就是膨胀图与俯视图之差,用于保留物体的边缘轮廓。
5:顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。
黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。
//-------------------更新博客----------------------------------------------------------------------
接下来更新一下十分简单的相关黑帽和顶帽以及相关函数的代码和说明
/*
膨胀和腐蚀是最基本的形态学运算,腐蚀和膨胀是针对高亮部分进行的操作
膨胀是针对高亮部分的领域扩张,腐蚀是高亮部分的区域腐。
通俗来说,就是白 {MOD},高光图像部分的扩大和缩小
开运算和闭运算也是针对这个原理来进行的。(dilate和erode之前,都要用一个
getStructuringElement函数获取自定义的腐蚀和膨胀核)
*/
#include
#include
#include
using namespace std;
using namespace cv;
void main()
{
/*
Mat img = imread("jack1.jpg");
Mat out;
Mat ele = getStructuringElement(MORPH_CROSS,Size(15,15));
//膨胀
dilate(img,out,ele);
imshow("out",out);
//腐蚀
erode(img,out,ele);
imshow("out", out);
*/
//开运算:先腐蚀再膨胀,用来消除小物体
//闭运算:先膨胀再腐蚀,用于排除小型黑洞
Mat img = imread("jack1.jpg");
Mat out;
Mat ele = getStructuringElement(MORPH_CROSS, Size(15, 15));
//高级形态学处理,调用morphologyEx()这个函数就可以了,具体要选择哪种操作,
//就修改第三个参数就可以了。这里演示的是形态学梯度处理
//参数都包括 MORPH_OPEN 开运算
// MORPH_CLOSE 闭运算
// MORPH_GRADIENT 形态学梯度
// MORPH_TOPHAT 顶帽
// MORPH_BLACKHAT 黑帽
// MORPH_ERODE 腐蚀
// MORPH_DILATE 膨胀
//顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。
//黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。
morphologyEx(img,out, MORPH_BLACKHAT,ele);
imshow("out",out);
Mat out2;
morphologyEx(img,out2,MORPH_TOPHAT,ele);
imshow("out2", out2);
waitKey(0);
system("pause");
return;
}
//-----------------------------
说一下相关的角点检测的问题,角点检测可以用来图像的特征提取。图像的特征包括三个方面:边缘,角点,斑点
一般要用到相关的normalize归一化操作才可以更好的根据阈值的大小来提取特征和判断特征。
//-------------------------------
说一下访问图像中每个像素点的访问方法
1:可以使用指针访问 2:可以使用迭代器把图像中的每个像素迭代以后再访问 3:可以使用地址.at()+偏移的方式访问
在所有访问方式中,指针直接访问是最高效和安全的方式。
//-----------------------------
(1)、仿射变换,它可以将矩形转换成平行四边形,也可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例缩放。透视变换除了能够处理仿射变换的操作外,还可以将矩形转换成梯形。即仿射变换后还是平行四边形,透视变换后是四边形。因此可以说仿射变换是透视变换的一个子集。
(2)、在OpenCV中,基于2*3矩阵进行的变换,是图像的仿射变换;基于3*3矩阵进行的变换,是图像的透视变换或者单应性映射。图像透视变换多用于图像校正