實驗三:圖像空間域平滑

實驗三:圖像空間域平滑

實驗目的

 理解 圖像空間域平滑的目的和意義
 瞭解圖像空間域平滑的各種方法及優缺點;
 掌握圖像空間域的鄰域運算方法;
 編程實現圖像局部平均法、空間低通率波法、中值濾波法對圖像進行濾波處理
 理解空間低通濾波法與其他各種圖象平滑的區別和聯繫
 對“椒鹽噪聲圖像”進行圖像平滑處理;
 總結實驗過程。

實驗要求

  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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章