计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

一、实验原理:

1、显示图像

cpp 复制代码
    void imshow(const string &name, InputArray image);

①功能:在指定窗口中显示图像。

②参数:name 为窗口的名字;image为待显示的图像。

③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。

2、读入图像

cpp 复制代码
    Mat imread(const String &filename, int flags = IMREAD_COLOR);

①功能:从指定文件读入图像。

②参数:filename 为图像文件名,支持BMP、DIB、JPEG、JPG、JPE、PNG、PBM、PGM、PPM、SR、RAS、TIFF、TIF等格式;flag通常可选IMREAD_UNCHANGED(等于-1,不转换载入图像)、IMREAD_GRAYSCALE(等于0,载入为灰度图像)、IMREAD_COLOR(等于1,载入为彩色图像)。

③说明:如果返回对象的*empty()*成员的调用结果为真,则表示图像文件载入失败。

3、响应键盘

cpp 复制代码
    int waitKey(int delay = 0);

①功能:等待按键事件。

②参数:delay为延迟的毫秒数。

③说明:该函数无限等待按键事件*(delay* ≤ 0) 或者延迟delay毫秒,返回值为按键值,如果超过指定时间则返回-1。

4、选取矩阵子集

cpp 复制代码
    Mat operator()(const Rect &roi) const;

①功能:返回输入矩阵的矩形子集的矩阵头。

②参数:roi为选取的矩形区域。

③说明:该函数返回输入矩阵中指定矩形区域对应子集的矩阵头,从而可以将输入矩阵的一个矩形子集当作一个独立矩阵处理。

5、离散傅立叶变换

cpp 复制代码
    void dft(InputArray src, OutputArray dst, int flags = 0);

①功能:执行单通道或双通道浮点数数组的离散傅立叶变换。

②参数:src 为输入数组,可以是实数数组(单通道)或复数数组(双通道);dst 为输出数组,类型和大小依赖于flags ,必要时重建;flags为变换标志,正变换通常选用下列值之一(逆变换使用DFT_SCALE(缩放结果)与下列值之一的组合):

1 DFT_COMPLEX_OUTPUT(输出双通道数组,每个元素存储一个复数)

2 DFT_REAL_OUTPUT(正变换使用压缩格式输出单通道数组;逆变换输出单通道数组,只存储实部)

③说明:若没有在变换标志中指定DFT_COMPLEX_OUTPUT 和DFT_REAL_OUTPUT,则输出数组与源数组通道数相同(逆变换下单通道的源数组是使用压缩格式存储的离散傅立叶正变换的结果)。

6、中值模糊

cpp 复制代码
    void medianBlur(InputArray src, OutputArray dst, int ksize);

① src:输入图像。

② dst:输出图像,大小和类型与源图像一致,必要时重建。

③ ksize:内核大小,必须是正奇数。


二、算法程序

1、使用OpenCV装入一幅大小至少为512×512的真彩色图像,并显示该图像。然后在源图像中指定一个矩形区域(左上顶点和宽高值分别为(128,256)和(256,128)的矩形),并在结果图像窗口中显示源图像中被选取的部分。

cpp 复制代码
#include<opencv2/opencv.hpp>
using namespace cv;
int main() {
	Mat src = imread("D:/Doge.jpg");
	if (src.empty()) {
	     return -1;
	}
	imshow("源图像", src);
	Mat dst = src({128, 256, 256, 128});
	imshow("结果图像", dst);
	waitKey();
}

2、使用OpenCV编写一个演示傅立叶变换和逆变换的程序。该程序首先装入一幅灰度图像并显示该图像,然后对该图像进行傅立叶正变换,对得到的结果进行傅立叶逆变换,显示得到的结果以便与原图像进行比对。

cpp 复制代码
#include<opencv2/opencv.hpp>
using namespace cv;
int main() {
	Mat src = imread("D:/Doge.jpg", 0);
	if (src.empty()) {
	     return -1;
	}
	imshow("源图像", src);
	src.convertTo(src, CV_32F);
	dft(src, src, DFT_COMPLEX_OUTPUT);
	idft(src, src, DFT_SCALE | DFT_REAL_OUTPUT);
	normalize(src, src, 1, 0, NORM_INF);
	imshow("结果图像", src);
	waitKey();
}

3、使用OpenCV编写一个程序,该程序对一幅彩色图像进行一次中值模糊,要求分别显示源图像和模糊化以后的图像。其中内核大小为5×5。

cpp 复制代码
#include<opencv2/opencv.hpp>
using namespace cv;
int main() {
	Mat src = imread("D:/Doge.jpg", 0), dst;
	if (src.empty()) {
	     return -1;
	}
	imshow("源图像", src);
	medianBlur(src, dst, 5);
	imshow("结果图像", dst);
	waitKey();
}

三、结果演示:

1、选取部分图像

2、傅立叶变换

3、中值模糊

相关推荐
xailorliu17 分钟前
矩阵定性-正定负定不定半正定半负定
c++·opencv·线性代数·计算机视觉·矩阵
个 人 练 习 生26 分钟前
C++-----string基本使用详解
开发语言·c++·学习
朝朝辞暮i33 分钟前
C++ 第 5 课:else if + 多条件判断 + && / || / !
开发语言·c++
千谦阙听40 分钟前
【C++篇】:string类——常用接口、底层原理与深浅拷贝
开发语言·c++·学习·visual studio
特立独行的猫A1 小时前
c++的`std::future` 与 `std::promise` 简明教程(5分钟读完)
c++
特立独行的猫A1 小时前
C++ 异步编程:std::future 与 std::promise 详解(含 RPC 客户端实现实践)
c++·后端
All for pursuit.1 小时前
【分治-2】215.数组中的第K个最大元素
数据结构·c++·算法·leetcode
lcj25111 小时前
【C++】set和map——详细使用说明
开发语言·c++·笔记·面试
潼心1412o1 小时前
C++初阶(长期更新)第3讲:类和对象(中)
开发语言·c++
程序喵大人2 小时前
【C++入门】编译链接模型 - 02 预处理把头文件怎样塞进源文件
开发语言·c++·预处理·编译链接·头文件·源文件