首先感谢博客园的Madcola博主,他给了我很多启发,也让我深受鼓舞,我的opencv系列博客都是受他启发而写。大家感兴趣的可以也去关注一下这位博主
#include<iostream>
#include<opencv.hpp>
#include<highgui.hpp>
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<img3.rows;i++) {
uchar *data = img3.ptr<uchar>(i);
for (int j = 0; j < img3.cols; j++)
{
printf("%d\n",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:膨胀和腐蚀操作是针对图像的白色(高亮)部分来进行的,膨胀后高亮部分更加高亮;腐蚀操作以后,高亮部分变小
开运算----先腐蚀再膨胀(消除小物体)
闭运算----先膨胀再腐蚀(消除小型黑洞)
4:形态学梯度:就是膨胀图与俯视图之差,用于保留物体的边缘轮廓。
5:顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。
黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。