圖像的卷積(濾波)運算(一)——圖像梯度


[toc]

1. 卷積/濾波原理

首先要明確的一點是圖像的卷積/濾波運算,是針對原圖像每一個像素進行處理,得到一個新的圖像的過程。那么進行怎么樣的運算呢?要知道圖像能夠被人所識別,是因為圖像中每個像素並不完全是離散而獨立的,每個像素都跟周圍的像素相關。因此,對每一個像素,選定其周圍一定范圍內的像素值進行運算,得到新的圖像的像素值也一定是相關的。而這個范圍,就是卷積/濾波的窗口。

只有相關的像素值是不夠的,還需要改變因子——也就是我們說的卷積核了。它就是之前說的卷積/濾波的窗口大小,通常由數學原理推導出來的。

最后,將窗口內覆蓋的像素值和卷積核值相乘並相加,就得到新的像素值填充到新的圖像中。對每個像素值都這樣做,就是卷積/濾波運算后新的圖像了。

2. 具體實例

以X方向上的一維卷積/濾波為例,選取一個卷積核(-1,0,1),對於圖像像素X,其卷積運算的結果Y=-1 × Xa + 0 × X + 1 × Xb,即總是X的后一個像素與前一個像素之差。示意圖如下:. 其具體實現代碼:

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

using namespace cv;
using namespace std;

int main()
{
	//從文件中讀取成灰度圖像
	const char* imagename = "D:\\Data\\imgDemo\\lena.jpg";
	Mat img = imread(imagename, IMREAD_GRAYSCALE);
	if (img.empty())
	{
		fprintf(stderr, "Can not load image %s\n", imagename);
		return -1;
	}

	//OpenCV函數進行一維卷積(梯度圖)
	Mat xKernel = (Mat_<double>(1, 3) << -1, 0, 1);			//卷積算子
	Mat Ix;
	filter2D(img, Ix, -1, xKernel);

	//自建算法進行一維卷積(梯度圖)
	Mat Ixx;
	Ixx.create(img.cols, img.rows, CV_8UC1);
	double xk[3] = { -1, 0, 1 };			//卷積算子
	for (int i = 0; i < img.rows; ++i)
	{
		for (int j = 0; j < img.cols; ++j)
		{
			//img.at<uchar>(i, j) = 255;
			uchar b[3] = { 0 };
			b[0] = (j == 0 ? 0 : img.at<uchar>(i, j - 1));
			b[1] = img.at<uchar>(i, j);
			b[2] = (j == img.cols - 1 ? 0 : img.at<uchar>(i, j + 1));

			double value = xk[0] * b[0] + xk[1] * b[1] + xk[2] * b[2];
			value = (std::min)(std::max(value, 0.0), 255.0);
			Ixx.at<uchar>(i, j) = (uchar)value;
		}
	}

	//比較兩者的結果
	Mat c;
	compare(Ix, Ixx, c, CMP_EQ);

	//顯示圖像
	imshow("原始", img);
	imshow("梯度圖(CV)", Ix);
	imshow("梯度圖(MY)", Ixx);
	imshow("比較結果", c);

	waitKey();
	return 0;
}

在這里分別通過OpenCV的filter2D和自己的算法實現了X方向上的一維卷積/濾波運算,顯示了其結果圖。最后還用compare函數比較兩者的差異,純白(像素值255)色表示兩者無差異。其運行結果如下:

3. 圖像梯度圖

這里的卷積核(-1,0,1)其實是從圖像的梯度推導出來的。如果把圖像看作是函數f(x),那么其X方向上梯度也就是函數X方向上的變化率為: 對所有的像素卷積運算都會除以2,對結果無關緊要,因此可以將其舍棄。最后就得到卷積核(-1,0,1)。 除此之外,也可以在Y方向上進行卷積,得到Y方向上的卷積圖,只不過卷積核需要轉置。

4. 參考資料

1.圖像梯度的基本原理 2.圖像梯度計算


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM