第16課 自定義線性濾波

1. 卷積

1.1 卷積的概念

  • 卷積是圖像處理中一個操作,是kernel在圖像的每個像素上的操作。
  • Kernel本質上一個固定大小的矩陣數組,其中心點稱爲錨點(anchor point)
    在這裏插入圖片描述

1.2 卷積如何工作

  • 把kernel放到像素數組之上,求錨點周圍覆蓋的像素乘積之和(包括錨點),用來替換錨點覆蓋下像素點值稱爲卷積處理。數學表達如下:在這裏插入圖片描述
  • 錨點像素值New pixel = sum / (mn),mn爲kernel的大小
    在這裏插入圖片描述

2. 常見的算子

2.1 Robert算子

在這裏插入圖片描述
分別找出45°和-45°角的特徵。

在這裏插入圖片描述
在這裏插入圖片描述

2.2 Sobel算子

在這裏插入圖片描述
分別找出豎直特徵和水平特徵。
在這裏插入圖片描述
在這裏插入圖片描述

2.3 拉普拉斯算子

在這裏插入圖片描述
找出所有特徵。
在這裏插入圖片描述

3. 自定義卷積模糊

自定義一個卷積核kernel,即結構元素,例如全爲1的kernel,kernel越大越模糊。
在這裏插入圖片描述

4. 相關API

filter2D()方法:給一幅圖進行卷積操作。

filter2D(
Mat src, //輸入圖像
Mat dst, // 輸出圖像
int depth, // 圖像深度32/8,通常設爲-1
Mat kernel, // 卷積核/模板大小
Point anchor, // 錨點位置,通常爲Point(-1, -1)
double delta // 計算出來的像素+delta
)

5. 例程


#include<opencv2/opencv.hpp>
#include<iostream>


using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	int ksize = 0;//自定義模糊結構元素大小

	src = imread("D:/resource/images/face.jpg");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	imshow("input image", src);

	// Robert X 方向
	Mat RobertX;
	Mat kernel_RobertX = (Mat_<int>(2, 2) << 1, 0, 0, -1);
	filter2D(src, RobertX, -1, kernel_RobertX, Point(-1, -1), 0.0);
	imshow("RobertX image", RobertX);
	//imwrite("D:/resource/output/RobertX.jpg", RobertX);


	// Robert Y 方向
	Mat RobertY;
	Mat kernel_RobertY = (Mat_<int>(2, 2) << 0, 1, -1, 0);
	filter2D(src, RobertY, -1, kernel_RobertY, Point(-1, -1), 0.0);
	imshow("RobertY image", RobertY);
	//imwrite("D:/resource/output/RobertY.jpg", RobertY);


	// Sobel X 方向
	Mat SobleX;
	Mat kernel_SobelX = (Mat_<int>(3, 3) << -1, 0, 1, -2, 0 , 2, -1, 0, 1);
	filter2D(src, SobleX, -1, kernel_SobelX, Point(-1, -1), 0.0);
	imshow("SobleX image", SobleX);
	//imwrite("D:/resource/output/SobelX.jpg", SobleX);

	// Sobel Y 方向
	Mat SobleY;
	Mat kernel_SobelY = (Mat_<int>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);
	filter2D(src, SobleY, -1, kernel_SobelY, Point(-1, -1), 0.0);
	imshow("SobleY image", SobleY);
	//imwrite("D:/resource/output/SobelY.jpg", SobleY);

	// 拉普拉斯算子
	Mat dst1;
	Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);
	filter2D(src, dst1, -1, kernel, Point(-1, -1), 0.0);
	imshow("拉普拉斯", dst1);
	//imwrite("D:/resource/output/L.jpg", dst1);


	//自定義模糊
	int c = 0;
	int index = 0;
	while (true) {
		c = waitKey(500);
		if ((char)c == 27) {// ESC退出 
			break;
		}
		ksize = 5 + (index % 8) * 2;
		Mat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);
		filter2D(src, dst, -1, kernel, Point(-1, -1));
		index++;
		imshow("自定義模糊 ", dst);
		//imwrite("D:/resource/output/DIY.jpg", dst);

	}

	//waitKey(0);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章