一、实验原理:
1、显示图像
void imshow(const string &name, InputArray image);
①功能:在指定窗口中显示图像。
②参数:name为窗口的名字;image为待显示的图像。
③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。
2、读入图像
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、响应键盘
int waitKey(int delay = 0);
①功能:等待按键事件。
②参数:delay为延迟的毫秒数。
③说明:该函数无限等待按键事件(delay≤0)或者延迟delay毫秒,返回值为按键值,如果超过指定时间则返回-1。
4、选取矩阵子集
Mat operator()(const Rect &roi) const;
①功能:返回输入矩阵的矩形子集的矩阵头。
②参数:roi为选取的矩形区域。
③说明:该函数返回输入矩阵中指定矩形区域对应子集的矩阵头,从而可以将输入矩阵的一个矩形子集当作一个独立矩阵处理。
5、离散傅立叶变换
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、中值模糊
void medianBlur(InputArray src, OutputArray dst, int ksize);
① src:输入图像。
② dst:输出图像,大小和类型与源图像一致,必要时重建。
③ ksize:内核大小,必须是正奇数。
二、算法程序
1、使用OpenCV装入一幅大小至少为512×512的真彩色图像,并显示该图像。然后在源图像中指定一个矩形区域(左上顶点和宽高值分别为(128,256)和(256,128)的矩形),并在结果图像窗口中显示源图像中被选取的部分。
#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编写一个演示傅立叶变换和逆变换的程序。该程序首先装入一幅灰度图像并显示该图像,然后对该图像进行傅立叶正变换,对得到的结果进行傅立叶逆变换,显示得到的结果以便与原图像进行比对。
#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。
#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、中值模糊