计算机图形图像技术(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、中值模糊

相关推荐
爱吃喵的鲤鱼9 分钟前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
7年老菜鸡36 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Ni-Guvara1 小时前
函数对象笔记
c++·算法
似霰1 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭1 小时前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++
霁月风1 小时前
设计模式——观察者模式
c++·观察者模式·设计模式
橘色的喵1 小时前
C++编程:避免因编译优化引发的多线程死锁问题
c++·多线程·memory·死锁·内存屏障·内存栅栏·memory barrier
何曾参静谧2 小时前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
AI街潜水的八角2 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习