圖像處理-拉普拉斯算法


一、引言

       圖像銳化處理的作用是使灰度反差增強,從而使模糊圖像變得更加清晰。圖像模糊的實質就是圖像受到平均運算或積分運算,因此可以對圖像進行逆運算,如微分運算能夠突出圖像細節,使圖像變得更為清晰。由於拉普拉斯是一種微分算子,它的應用可增強圖像中灰度突變的區域,減弱灰度的緩慢變化區域。

二、卷積算法

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兩個方向的二階差分分別為,

CodeCogsEqn(3)

CodeCogsEqn(4)

       為了更適合於數字圖像處理,將該方程表示為離散形式:

寫成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);

original

上圖中上圖為原圖像,有圖為拉普拉斯之后的圖像。



免責聲明!

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



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