数字图像处理合集一opencv环境配置及入门级练手数字图像处理

这次出一个数字图像处理合集,用的是opencv3.4.6+vs2017版本。本合集逐渐深入,分为环境配置及入门、几何变换、图像增强、图像分割、形态学处理、图像特征和车流量统计部分。
本合集适合数字图像处理的初学者。

1、配置图像处理编程环境步骤
数字图像处理合集一opencv环境配置及入门级练手数字图像处理_第1张图片
将opencv3.4.6解压到安装目录之后,打开VS2017,新建Windows桌面控制台程序,在属性管理器上点出Microsoft.Cpp.x64.user,点开属性一栏,在VC++目录下修改包含目录及库目录的内容。结果如图一所示。
数字图像处理合集一opencv环境配置及入门级练手数字图像处理_第2张图片

在链接器的附加依赖项添加对应lib文件。结果如图二所示。
数字图像处理合集一opencv环境配置及入门级练手数字图像处理_第3张图片

将调试改为Debug及x64模式。因为之前的配置都是按照x64配置的。综上,配置完成。

2、OpenCV读入、显示、存储图像的相关函数接口定义:
在读入、显示和存储图像中,首先需要定义用于存储图像的变量,在OpenCV中,通过定义cv::Mat类的对象来实现。定义图像变量的代码为:cv::Mat image。调用imread()函数可以读取图像文件,该函数读入图像文件并对其进行解码、分配内存,实例代码为:

image=cv::imread(“tiger.jpg”);

显示图像,需要调用cv::namedWindow()来创建一个显示窗口,实例代码为:

cv::namedWindow(“Original image”);

然后调用cv::imshow()来显示图像。定义另一个图像的变量,用于存储处理后的结果:
cv::Mat result;调用cv::flip()函数对image进行处理,其功能是翻转图像并将结果存储在result中。
创建显示处理后图像的窗口:
cv::namedWindow(“Output Image”);调用cv::imwrite()函数存储处理后的图像result;实例代码:

cv::imwrite(“output Image”,result);

在cv::imwrite()函数调用中,实参中的扩展名决定了保存图像所使用的编码方式。

3、三种遍历图像数据的方法介绍:
三种遍历图像数据的方法分别包括at方法、使用迭代器和使用指针。在任何图像处理算法都是从操作每个像素开始的。
at方法中,cv::Mat提供了一个at(int y,int x)函数模板来操作指定位置的矩阵元素,在使用时指定函数返回的数据类型。at方法代码示例如下:

if (srcImage.channels() == 3)
	{
		//遍历图像像素
		for (int i = 0; i < nRows; i++)
		{
			for (int j = 0; j < nCols; j++)
			{
				resultImage.at<cv::Vec3b>(i, j)[0] = 255 - srcImage.at<cv::Vec3b>(i, j)[0];
				resultImage.at<cv::Vec3b>(i, j)[1] = 255 - srcImage.at<cv::Vec3b>(i, j)[1];
				resultImage.at<cv::Vec3b>(i, j)[2] = 255 - srcImage.at<cv::Vec3b>(i, j)[2];
			}
		}
	}

迭代器中,迭代器类似于STL库的用法,opencv可以采用迭代器实现像素的操作。同样,在使用迭代器时需要指定返回的数据类型。迭代器方法代码示例如下:

resultImage = srcImage.clone();
	Mat_<Vec3b>::iterator it = srcImage.begin<Vec3b>();
	Mat_<Vec3b>::iterator itend = srcImage.begin<Vec3b>();
	for (; it != itend; it++)
	{
	      (*it)[0] = (*it)[0] / 255 * 255 + 255 / 2;
	      (*it)[1] = (*it)[1] / 255 * 255 + 255 / 2;
	      (*it)[2] = (*it)[2] / 255 * 255 + 255 / 2;
	}

指针中,cv::Mat提供了一个ptr(int i)函数模板以获取指定行数据的首地址。利用这一地址即可实现对像素的操作。同样的,在使用ptr(int i)函数时需要指定返回的数据类型。指针方法代码示例如下:

resultImage = srcImage.clone();
	Mat_<Vec3b>::iterator it = srcImage.begin<Vec3b>();
	Mat_<Vec3b>::iterator itend= srcImage.begin<Vec3b>();
	for ( ;it != itend; it++)
	{
	     (*it)[0] = (*it)[0] / 255*255 + 255/ 2;
	     (*it)[1] = (*it)[1] / 255 * 255 + 255 / 2;
	     (*it)[2] = (*it)[2] / 255 * 255 + 255 / 2;
	}

合集入口

测试资源下载入口

你可能感兴趣的:(数字图像处理,初学者C++,opencv,c++,图像处理)