一、引言
圖像銳化處理的作用是使灰度反差增強,從而使模糊圖像變得更加清晰。圖像模糊的實質就是圖像受到平均運算或積分運算,因此可以對圖像進行逆運算,如微分運算能夠突出圖像細節,使圖像變得更為清晰。由於拉普拉斯是一種微分算子,它的應用可增強圖像中灰度突變的區域,減弱灰度的緩慢變化區域。
二、卷積算法
2.1卷積原理
因此,銳化處理可選擇拉普拉斯算子對原圖像進行處理,產生描述灰度突變的圖像,再將拉普拉斯圖像與原始圖像疊加而產生銳化圖像。此原理實際為卷積操作,也可以理解為一種圖像變換,最常見的圖像變換(image transform,即將一幅圖像轉變成圖像數據)就是傅里葉變換(Fourier transform),即將圖像轉換成源圖像數據的另一種表示,而卷積是大多數變換的基礎。
我們可以用方程來表示這個過程。我們首先定義圖像為I(x,y),核為G(x,y),
參考點位於相應核的(ai,aj)坐標上,則卷積H(x,y)定義如下:
邊緣部分使用復制處理,計算方法如下圖所示:
2 .2 opencv卷積函數說明
void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint chor=cvPoint(-1,-1)); src:輸入圖像 dst:輸出圖像 kernel:卷積核, 單通道浮點矩陣. 如果想要應用不同的核於不同的通道,先用 cvSplit 函數分解圖像到單個色彩通道上,然后單獨處理。 anchor:核的錨點表示一個被濾波的點在核內的位置。 錨點應該處於核內部。缺省值 (-1,-1) 表示錨點在核中心。
其實在利用此卷積函數是,根據核的不同可以產生各種的圖像處理,比如:
#include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp> #include <opencv/cv.hpp> using namespace std; using namespace cv; int main() { string picName="lena.jpg"; Mat A=imread (picName,CV_LOAD_IMAGE_COLOR); Mat mask=(Mat_<char>(3,3)<<0,-1,0, -1,5,-1, 0,-1,0); Mat B; filter2D (A,B,A.depth (),mask); imshow("A的圖像",A); imshow("B的圖像",B); waitKey (); return 0; }
三、拉普拉斯算法
3.1 拉普拉斯原理說明
普拉斯算子是最簡單的各向同性微分算子,具有旋轉不變性。一個二維圖像函數 的拉普拉斯變換是各向同性的二階導數,定義為:
在一個二維函數f(x,y)中,x,y兩個方向的二階差分分別為,
為了更適合於數字圖像處理,將該方程表示為離散形式:
寫成filter mask的形式如下,
注意該(a)的mask的特點,mask在上下左右四個90度的方向上結果相同,也就是說在90度方向上無方向性。為了讓該mask在45度的方向上也具有該性質,對該filter mask進行擴展定義為(b)。
將Laplace算子寫成filter mask后,其操作大同小異於其他的空間濾波操作。將filter mask在原圖上逐行移動,然后mask中數值與其重合的像素相乘后求和,賦給與mask中心重合的像素,對圖像的第一,和最后的行和列無法做上述操作的像素賦值零,就得到了拉普拉斯操作結果。
3.2 opencv函數應用
Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
src_gray,輸入圖像
dst,Laplace操作結果
ddepth,輸出圖像深度,因為輸入圖像一般為CV_8U,為了避免數據溢出,輸出圖像深度應該設置為CV_16S
kernel_size,filter mask的規模,我們的mask時3x3的,所以這里應該設置為3
scale,delta,BORDER_DEFAULT,默認設置就好
//load the Original Image and get some informations Mat src = imread("012.jpg",0); namedWindow("OriginalImage"); imshow("OriginalImage",src); CV_Assert(src.depth() == CV_8U); //OpenCV solution - Laplacian Mat dst,abs_dst_laplace; Laplacian(src,dst,CV_16S,3); convertScaleAbs(dst,abs_dst_laplace); //show the result namedWindow("result_laplacian"); imshow("result_laplacian",abs_dst_laplace);
上圖中上圖為原圖像,有圖為拉普拉斯之后的圖像。