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

相关推荐
tan77º13 分钟前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
GiraKoo1 小时前
【GiraKoo】C++14的新特性
c++
悠悠小茉莉1 小时前
Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)
c++·ide·vscode·python·visualstudio·visual studio
坏柠1 小时前
C++ Qt 基础教程:信号与槽机制详解及 QPushButton 实战
c++·qt
泽02022 小时前
C++之红黑树认识与实现
java·c++·rpc
岁忧2 小时前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
whoarethenext3 小时前
使用 C++ 实现 MFCC 特征提取与说话人识别系统
开发语言·c++·语音识别·mfcc
R-G-B3 小时前
【MFC】Combobox下拉框中4个选项,运行后点击下拉框选项不能全部展示出来,只能显示2个选项,需要垂直滚动条滚动显示其余选项
c++·mfc
视觉人机器视觉4 小时前
Visual Studio2022和C++opencv的配置保姆级教程
c++·opencv·visual studio
liulilittle4 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++