基于OpenCV的图像编程基础实验

基于OpenCV的图像编程基础实验

实验要求:

  1. 配置基于VS201×+OpenCV2.4.×的图像处理编程环境。
  2. 读入、显示及存储图像。
  3. 编写三种遍历扫描整幅图像的方法,对灰度图像增强亮度,对彩色图像加入300个椒盐噪声,以此掌握如何操作像素。
  4. 构造基于MFC的数字图像处理人机交互方式。
    代码链接: https://download.csdn.net/download/qq_43478778/87268262

主要实验步骤:

1、配置图像处理编程环境步骤;
(1)设置电脑属性中的三个变量
图2-1 新建OpenCV用户变量

图2-1 新建OpenCV用户变量
在这里插入图片描述
图2-2 编辑用户变量

在这里插入图片描述

图2-3 编辑系统变量

(2)配置VS2013
①打开VS2013,新建项目→win32控制台项目→完成。
②点击“视图”→“其他窗口”→“属性管理器”。
③点击“解决方案资源管理器”→右键,单击“属性”→配置资源管理器→“活动解决方案平台”选择x64。
④从右侧项目中打开“Debug | x86”→“Microsoft.Cpp.x64.user”→点击左侧“VC++目录”→编辑右侧的“可执行文件目录”、“包含目录”与“库目录”,分别添加对应的路径。
⑤在“链接器”→“输入”→“添加附加依赖项”→在附加依赖项里,添加opencv\build\x86\vc12\lib文件夹里的lib文件名称.

2、OpenCV读入、显示、存储图像的相关函数接口定义:
(1)读入图像:
imread()函数可以读取图像文件,该函数读入图像文件并对其进行解码、分配内存。
函数原型为 Mat imread( const String& filename, int flags = IMREAD_COLOR );
其中,第一个参数指图片路径名,第二个参数表示图片读入的方式(flags可以缺省,缺省时flags=1,表示以彩色图片方式读入图片)flags>0时表示以彩色方式读入图片 ;flags=0时表示以灰度图方式读入图片; flags<0时表示以图片的本来的格式读入图片。
例如:cv::Mat srcImage = cv::imread(“…\lena_gray8bit.bmp”, -1);
(2)显示图像:
用imshow()函数在窗口显示图像,窗口大小自适应图像尺寸。
函数原型:void imshow(const string& winname, InputArray mat),函数的第一个参数是一个窗口标题,第二个参数是图像。
如果窗口是使用cv::WINDOW_AUTOSIZE标志创建的,则图像显示为其原始大小,但仍受屏幕分辨率的限制。否则,图像将按比例缩放以适合窗口。该函数可以缩放图像,取决于其深度:
①imshow可以直接显示8位无符号整型图像,像素值范围位(0,255)。
②imshow可以直接显示16位无符号或32位整数,但是像素需要除以256。也就是说,值范围[0,255*256]被映射到[0,255]。
③imshow也是可以直接正常显示浮点型图像(32位或64位)的,当inshow函数遇到浮点型图像时,像素值将乘以255。
例如:cv::namedWindow(“Original Image”);
cv::imshow(“Original Image”, srcImage);
(3)存储图像:
imwrite函数功能:用于将图像保存到指定的文件,可以为各种格式的图像。
函数原型为:
bool cv::imwrite(const String & filename,InputArray img,const std::vector & params = std::vector() )
第一个参数filename:需要保存图像的文件名,要保存图片为哪种格式,就带什么后缀。
第二个参数img:要保存的图像。
第三个参数params:表示为特定格式保存的参数编码。
例如:cv::Mat result;/定义result用于存储处理后的结果
cv::imwrite(“output.bmp”,result);

3、三种遍历图像数据的方法介绍。
(1)at方法
利用cv::Mat的at(int x,int y)方法可以访问元素,其中x是行号,y是列号。在编译时必须明确方法返回值的类型,因为cv::Mat可以接受任何类型的元素,所以程序员需要指定返回值的预期类型。正因为如此,at方法被实现成一个模板方法。在调用at方法时,必须指定图像元素的类型,例如:
image.at(i,j)= 255;// 单通道图像
image.atcv::Vec3b(i, j)[channel] = value;// 三通道图像
(2)使用迭代器
使用OpenCV自带的Mat中的迭代器,可以方便地进行遍历数组操作。在迭代法中,首先需要获得图像矩阵的begin和end,然后增加迭代直至从begin到end。将*操作符添加在迭代指针前,即可访问当前指向的内容。同样,在使用前需要指定返回的数据类型。例如:
cv::MatIterator_cv::Vec3bit;
cv::Mat_cv::Vec3b::iterator it;
(3)使用指针
cv::Mat提供了一个ptr(int i)函数模板以获取指定行数据的首地址。在遍历图像像素时,在外层循环中首先利用ptr函数使指针p指向每行的起始地址,然后在内层循环中通过p[j]遍历得到该行的各个像素值。同样,在使用前需要指定返回的数据类型。例如:
Image.ptr(i);

实验结果与分析

1、显示图像结果截图
(1)灰度图像显示
代码:
在这里插入图片描述显示结果截图:
在这里插入图片描述

(2)彩色图像显示
代码:
在这里插入图片描述显示结果截图:
在这里插入图片描述

2、写图像结果截图
把原图像再写回到文件夹中,命名为Original Image.png。
代码:
在这里插入图片描述

显示结果截图:
在这里插入图片描述
3、灰度图像亮度增加结果截图
利用at方法、指针方法、迭代器方法分别对图像像素进行遍历,其中,saturate_cast函数的作用即是:当运算完之后,结果为负,则转为0,结果超出255,则为255。也可以利用if语句把像素超过255的置为255,把小于0的置为0。
代码:
在这里插入图片描述显示结果截图:
在这里插入图片描述(注:从左到右依次为原图像、at方法遍历亮度增强30、指针方法遍历亮度增强60、迭代器方法遍历亮度增强100)

4、彩色图像加入椒盐噪声的结果截图
利用at方法对彩色图像进行遍历,借用随机函数,在保证x和y都在图像的行数和列数范围内的前提下,随机生成白色噪音点和黑色噪音点的坐标,若x+y为偶数,则添加黑色噪音点;若x+y为奇数,则添加白色噪音点。
代码:
在这里插入图片描述显示结果截图:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值