opencv学习(2)图像处理的基本基础知识

首先感谢博客园的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:顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。

黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。

猜你喜欢

转载自blog.csdn.net/jackchoise030/article/details/88172845