实验三:图像空间域平滑

实验三:图像空间域平滑

实验目的

 理解 图像空间域平滑的目的和意义
 了解图像空间域平滑的各种方法及优缺点;
 掌握图像空间域的邻域运算方法;
 编程实现图像局部平均法、空间低通率波法、中值滤波法对图像进行滤波处理
 理解空间低通滤波法与其他各种图象平滑的区别和联系
 对“椒盐噪声图像”进行图像平滑处理;
 总结实验过程。

实验要求

  1. 编写图像 空间域平滑程序
     编程对图像作各种平滑处理,编写图像空间域平滑子程序,子程序包括: 邻域 平均法、中
    值滤波法;
     用不同的平滑方法处理不同类型噪声的图像,观察不同的图像平滑 方法、 不同的平滑参数
    对图像平滑的的作用;
     观察不同的图像平滑方法对具有椒盐类噪声的图像的处理效果 ,输出处理后的结果 。
  2. 观察图像平滑处理结果
     利用 Photoshop 对图像实施平滑处理。
     实现图像平滑方法;
     分析对比 Photoshop 和自己编写的图像平滑程序处理效果不同之处,并设法改 进 自己的图
    像处理程序。

扩展内容

  1. 查找 双边滤波 算法 ,用双边滤波对扩展图像 3 进行 增强处理,消除 人物 脸上的斑点。

代码及操作

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

// 部分参数
int DELAY_CAPTION = 1500;//字幕显示时长
int DELAY_BLUR = 100;//加深模糊的时间间隔
int MAX_KERNEL_LENGTH = 31;//核的边长最大值

// 通用的矩阵,和显示函数
Mat src; Mat dst;
char window_name[] = "Smoothing Demo";
int display_caption(const char* caption);
int display_dst(int delay);
int BlursDisplay(char original[]); 

int main()
{
	char ori_1[] = "Salt and pepper-1.jpg";
	BlursDisplay(ori_1);

	char ori_2[] = "Salt and pepper-2.jpg";
	BlursDisplay(ori_2);

	char ori_3[] = "Gaussian noise.jpg";
	BlursDisplay(ori_3);

	char ori_4[] = "extension-1.jpg";
	BlursDisplay(ori_4);

	char ori_5[] = "extension-2.jpg";
	BlursDisplay(ori_5);

	return 0;

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 轮流显示模糊效果
int BlursDisplay(char original[])
{
	//读入图像,创建窗口
	src = imread(original, IMREAD_COLOR);
	namedWindow(window_name, WINDOW_AUTOSIZE);

	//显示“Original Image”字幕和源图像,如果按键则display_caption函数返回非零值,程序结束
	if (display_caption(original) != 0) { return 0; }
	dst = src.clone();
	if (display_dst(DELAY_CAPTION) != 0) { return 0; }

	//邻域平均模糊,调用cv:blur(),晶格边长从1开始每次循环递增2,到MAX_KERNEL_LENGTH为止
	//显示“Homogeneous Image”字幕和源图像,如果按键则display_caption函数返回非零值,程序结束
	if (display_caption("Homogeneous Blur") != 0) { return 0; }
	for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
	{
		blur(src, dst, Size(i, i), Point(-1, -1));
		if (display_dst(DELAY_BLUR) != 0) { return 0; }
	}

	//高斯模糊,调用cv:GaussianBlur(),晶格变化同上
	//显示“Gaussian Blur"字幕和源图像,如果按键则display_caption函数返回非零值,程序结束
	if (display_caption("Gaussian Blur") != 0) { return 0; }
	for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
	{
		GaussianBlur(src, dst, Size(i, i), 0, 0);
		if (display_dst(DELAY_BLUR) != 0) { return 0; }
	}

	//中值模糊,调用cv:medianBlur(),晶格变化同上
	//字幕变化
	if (display_caption("Median Blur") != 0) { return 0; }
	for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
	{
		medianBlur(src, dst, i);
		if (display_dst(DELAY_BLUR) != 0) { return 0; }
	}

	//双边模糊,调用cv:bilateralBlur,晶格变化同上
	//字幕变化
	if (display_caption("Bilateral Blur") != 0) { return 0; }

	for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
	{
		bilateralFilter(src, dst, i, i * 2, i / 2);
		if (display_dst(DELAY_BLUR) != 0) { return 0; }
	}

	//结束工作
	display_caption("End: Press a key!");
	waitKey(0);
	return 0;

}

// 显示字幕(内容)
int display_caption(const char* caption)
{
	// 设置空Mat dst
	Mat dst = Mat::zeros(src.size(), src.type());

	//调用putText函数加入字幕
	//void putText( InputOutputArray img, const String& text, Point org,
	//int fontFace, double fontScale, Scalar color,
	//int thickness = 1, int lineType = LINE_8,
	//bool bottomLeftOrigin = false );
	putText(dst, caption,
		Point(src.cols / 4, src.rows / 2),
		FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255));

	//显示图像,若延迟时按键则返回-1,若未按键则返回0.
	imshow(window_name, dst);
	int c = waitKey(DELAY_CAPTION);
	if (c >= 0) { return -1; }
	return 0;
}

// 显示dst图像(含延迟),若延迟时按键则返回-1,若未按键则返回0.
int display_dst(int delay)
{
	imshow(window_name, dst);
	int c = waitKey(delay);
	if (c >= 0) { return -1; }
	return 0;
}
Photoshop自带模糊种类

在这里插入图片描述

对椒盐噪声图像-1进行半径为2的方框模糊(平均模糊)

在这里插入图片描述

对椒盐噪声图像-1进行半径为20的高斯模糊

在这里插入图片描述

对椒盐噪声图像-1进行某种场景模糊

在这里插入图片描述

对实验三扩展-2进行径向模糊

在这里插入图片描述

对比
  • Photoshop的模糊处理拥有更为直观的操作界面,方便更改参数。
  • Photoshop拥有更丰富的模糊功能
  • Photoshop有历史记录功能,可以还原以前的操作步骤

不足之处

经实验,cv:putText()函数不兼容中文,参考资料【2】中有介绍方法,但因时间有限暂未采用。

参考资料

  1. OpenCV平滑图像:https://www.w3cschool.cn/opencv/opencv-a4gp2cfi.html
  2. OpenCV显示中文汉字:https://blog.csdn.net/hk121/article/details/80612797
  3. 模糊效果,简单讲解5种常见的模糊效果:http://www.16xx8.com/photoshop/jiaocheng/2015/138973.html
  4. PS“模糊” 滤镜快速入门指南:http://www.photoworld.com.cn/post/97537
  5. OpenCV显示中文汉字:https://blog.csdn.net/hk121/article/details/80612797
  6. 模糊效果,简单讲解5种常见的模糊效果:http://www.16xx8.com/photoshop/jiaocheng/2015/138973.html
  7. PS“模糊” 滤镜快速入门指南:http://www.photoworld.com.cn/post/97537
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章