【電腦視覺】形態學濾波

來源:互聯網
上載者:User

標籤:

【電腦視覺】形態學濾波

標籤(空格分隔): 【影像處理】 【訊號處理】

著作權聲明:本文為博主原創文章,轉載請註明出處http://blog.csdn.net/lg1259156776/。

說明:本文主要想弄清楚形態學濾波在圖象處理和訊號處理中的應用,影像處理中非常直觀的通過腐蝕膨脹獲得開閉運算的效果,而在資料即時濾波中,形態學濾波也是可以使用的。

形態學濾波基本知識

原理:在特殊領域運算形式——結構元素(Sturcture Element),在每個像素位置上與二值映像對應的地區進行特定的邏輯運算。運算結構是輸出映像的相應像素。運算效果取決於結構元素大小內容以及邏輯運算性質。

膨脹、腐蝕、開、閉運算是數學形態學最基本的變換。

結構元素簡單地定義為像素的結構(形狀)以及一個原點(又稱為錨點),使用形態學濾波涉及對映像的每個像素應用這個結構元素,當結構元素的原點與給定的像素對齊時,它與映像相交部分定義了一組進行形態學運算的像素。原則上,結構元素可以是任何形狀,但通常使用簡單的形狀,比如方形、圓形和菱形,而原點位於中心位置(基於效率的考慮)。

腐蝕和膨脹兩個濾波操作也運算在每個像素周圍像素集合上(鄰域),這是由結構元素定義的。當應用到一個給定的像素時,結構元素的錨點與該像素的位置對齊,而所有與他相交的像素都被包括在當前像素集合中。腐蝕替換當前像素為像素集合中找到的最小的像素值,而膨脹則替換為像素集合中找到的最大像素值。當然,對於二值映像,每個像素只能被替換為白色像素或黑色像素。

這一段的論述,可以參考Opencv電腦視覺 編程手冊。對於腐蝕和膨脹的差別,可以通過想象,腐蝕呢, 如果給定像素的結構元素觸碰到背景,那麼該像素被設定為背景,而在膨脹的情況下,如果觸碰到前景,該像素被設定為前景,所以很明顯,腐蝕操作後物體的尺寸會減小,而膨脹操作後物體的尺寸會增大,同時內部的一些洞被填滿。

事實上,腐蝕一副映像兩次,就像是讓結構元素對自己進行膨脹後再去腐蝕同一幅映像;反過來對膨脹也是合適的。

有下面兩種說法:

  1. 對映像的腐蝕操作等於對映像負片的膨脹操作的負片;
  2. 對映像的膨脹操作等於對映像負片的腐蝕操作的負片;

實際上說的是對目標進行的腐蝕,等效於對背景進行的膨脹;反之亦然。

腐蝕的最簡單的應用是消除不相關的細節,而膨脹的最簡單的應用是將裂縫橋接起來。開運算是先腐蝕再膨脹,開運算一般斷開狹窄的間斷和消除細的突出物,而閉操作通常消彌狹窄的間斷和長細的鴻溝,消除小的孔洞,並填充輪廓線中的斷裂。開運算與閉運算的結合使用能使作用對象的輪廓變得光滑

開運算是先腐蝕再膨脹,而閉運算是先膨脹再腐蝕;
在檢驗閉濾波器的結果時,可以看到白色前景物體中的小洞被填充,該濾波器同時串連多個相鄰物體,基本上,無法完全包含結構元素的洞洞或者縫隙都將被濾波器移除。反過來,開濾波器則是移除掉情境中比較小的物體,因為它門無法完全包含結構元素。

這些濾波器通常在物體檢測中應用,閉濾波器將誤分割為片段的物體重新串連起來,而開濾波器則去除掉映像雜訊點引起的小像素塊(Blob)。因此,在視頻序列中使用他們很有協助,如果測試的二值映像相繼使用閉、開操作,獲得映像將只顯示情境中的主要物體。如果優先處理噪點,也可以先進行開運算,再進行閉運算,但是有可能去除掉一些分散的物體。

需要注意的是,對於對於一幅映像多次使用相同的開運算或者閉運算是沒有效果的,因為在第一次閉(開)運算填充映像中的洞洞後,再次應用相同的濾波,不會對映像產生任何變化。用數學的術語講,這些運算是等冪的。

使用形態學濾波對映像進行邊緣及角點檢測

形態學濾波可以用於檢測映像中指定的特徵。
一種比較形象的方法是將灰階映像看做是“等高線”(比如分水嶺映像分割演算法):亮的地區代表山峰,而暗的地區代表山穀,映像的邊沿就對應於峭壁。如果腐蝕一幅映像,會導致山穀被擴充,而峭壁減少了。相反的,如果膨脹一幅映像,峭壁則會增加。但是這兩種情況下,中間的部分(大片的穀底和高原)基本保持不變。

在上述理解的基礎上,如果我們對映像的腐蝕和膨脹的結果做差,就能提取映像的邊界:因為邊界地區,二者完全不同。(實際上,我們也可以用腐蝕或者膨脹的結果與源映像做差得出類似結果,但提取的邊界會比較細)。可以看出,結構元越大,邊界越粗。在OpenCV中,將形態學操作函數morphologyEx 的第4個參數設為MORPH_GRADIENT,就能完成上述工作。

利用形態學操作擷取角點稍微有一些複雜,它試用了四種不同的結構元素,基本方法是對一幅映像先腐蝕,在膨脹但是這兩次操作使用的結構元卻不同。這些結構元的選取使得直線保持不變,但是由於他們各自作用的效果,角點處的邊沿被影響了。我們結合一幅圖來說明:

第一幅圖是原圖。在被十字形元素膨脹後,方塊的邊緣被擴張,而由於十字形元素沒有擊中角點,此處不受影響。中間的方塊描述了這個結果;膨脹後的映像接著被菱形元素腐蝕,這次運算將大多數的邊緣恢複到原始位置,但之前沒有膨脹過的角點被向內推動,之後得到了左邊的方塊,可以看到,他缺少明顯的角點。同樣的處理過程通過X形與方形元素得到重複。這兩個元素結構是先前元素的旋轉版本,捕獲的將是45°旋轉後的角點。最後,對兩次過程的結果做差值,提取角點特徵。

代碼可以參考參考文獻3.

形態學濾波之圖象處理

一般腐蝕操作對二值圖進行處理,腐蝕操作如,中心位置的像素點是否與周圍領域的像素點顏色一樣(即是否是白色點,即值是否為255),若一致,則保留,不一致則該點變為黑色(值即為0)

opencv中的腐蝕操作:

CVAPI(void)  cvErode( const CvArr* src, CvArr* dst,                      IplConvKernel* element CV_DEFAULT(NULL),                      int iterations CV_DEFAULT(1) );

前兩個參數比較熟悉,第三個參數是用於傳遞模板的資訊,預設是(NULL),即為3*3的模板,第四個參數是迭代的次數(即該腐蝕操作做幾次);

opencv中的膨脹操作其實就是腐蝕的反操作:

CVAPI(void)  cvDilate( const CvArr* src, CvArr* dst,                       IplConvKernel* element CV_DEFAULT(NULL),                       int iterations CV_DEFAULT(1) );

測試代碼:
#include “stdafx.h”
#include “cv.h”
#include “highgui.h”

int main(){    IplImage *img= cvLoadImage("C:/fu.jpg");//讀取圖片    cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);    cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);    cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);    cvShowImage("Example1",img);//在Example1顯示圖片    //    cvCopy(img,temp);    IplImage* temp=cvCreateImage( //建立一個size為image,三通道8位的彩色圖        cvGetSize(img),        IPL_DEPTH_8U,        3        );    cvErode(img,temp,0,1);//腐蝕    cvShowImage("Example2",temp);    cvDilate(img,temp,0,1);//膨脹    cvShowImage("Example3",temp);    cvWaitKey(0);//暫停用於顯示圖片    cvReleaseImage(&img);//釋放img所指向的記憶體空間並且    cvDestroyWindow("Example1");    cvDestroyWindow("Example2");    cvDestroyWindow("Example3");    return 0;}


以上都是在模板3*3的情況下處理的,要是我們期望使用自己定義的模板時候,就需要自己做模板。

CVAPI(IplConvKernel*)  cvCreateStructuringElementEx(            int cols, int  rows, int  anchor_x, int  anchor_y,            int shape, int* values CV_DEFAULT(NULL) );

前兩個參數是定義模板的大小,後兩個參數是參考點的座標(比如預設3*3模板的參考點座標是2*2),第五個參數是模板的類型(可以是矩形,十字形,橢圓形,甚至是使用者自己定義形狀),最後一個參數是在使用自自訂形狀的時候,通過value傳遞模板的形狀。

模板的類型:

CVAPI(void)  cvReleaseStructuringElement( IplConvKernel** element ); //釋放模板所佔用的記憶體

自訂5*5,參考點(3,3)的矩形模板的測試代碼:

#include "stdafx.h"#include "cv.h"#include "highgui.h"int main(){    IplImage *img= cvLoadImage("C:/fu.jpg");//讀取圖片    cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);    cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);    cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);    cvShowImage("Example1",img);//在Example1顯示圖片    //    cvCopy(img,temp);    IplImage* temp=cvCreateImage( //建立一個size為image,三通道8位的彩色圖        cvGetSize(img),        IPL_DEPTH_8U,        3        );    IplConvKernel * myModel;    myModel=cvCreateStructuringElementEx( //自訂5*5,參考點(3,3)的矩形模板        5,5,2,2,CV_SHAPE_RECT        );    cvErode(img,temp,myModel,1);    cvShowImage("Example2",temp);    cvDilate(img,temp,myModel,1);    cvShowImage("Example3",temp);    cvWaitKey(0);//暫停用於顯示圖片    cvReleaseStructuringElement(&myModel);    cvReleaseImage(&img);//釋放img所指向的記憶體空間並且    cvDestroyWindow("Example1");    cvDestroyWindow("Example2");    cvDestroyWindow("Example3");    return 0;}


形態學濾波之訊號處理

數學形態學的方法可以理解為一個具有一定直徑的小球滾過一段特定的路徑,各種訊號可以看作是路徑上的小坑。由於所有的雜訊都有個共同特徵一一高頻低峰(它們構成非常複雜,由各種混合在眼電訊號中的其他成份或眼球快速、微小、空間大小不超過1“的運動導致),這些小坑的徑長明顯小於小球直徑,因此小球球心的滾動軌跡不會受雜訊的幹擾一一小球球心滾動軌跡即可以看成數學形態學處理後的訊號。本系統中用到的數學形態學運算元包括腐蝕運算、膨脹運算、開操作、閉操作。

腐蝕的最簡單的應用是消除不相關的細節,而膨脹的最簡單的應用是將裂縫橋接起來。開運算是先腐蝕再膨脹,開運算一般斷開狹窄的間斷和消除細的突出物,而閉操作通常消彌狹窄的間斷和長細的鴻溝,消除小的孔洞,並填充輪廓線中的斷裂。開運算與閉運算的結合使用能使作用對象的輪廓變得光滑

#include <stdio.h>#include <fcntl.h>//#include <sys/types.h>//#include <sys/stats.h>#include <time.h>#define N 5  //結構元素。大小設定根據濾除波形一個周期中點個數來定。例如:採樣率250,濾除50hz,                                                                 //因為50hz一個周期中有5個點,所以N設為5。          float x[3*N+2]={0.0};void openoperate(float input[],float dilation[]) //開運算:先腐蝕再膨脹{    int i,k,t;    float tmp;    t=2*N+3;    float erosion[2*N+3];    for(k=0;k<t;k++){        tmp=input[k];        for(i=k+1;i<k+N;i++){            if(tmp>input[i])                tmp=input[i];        }        erosion[k]=tmp;    }    t=t-3;    for(k=0;k<t;k++){        tmp=erosion[k];        for(i=k+1;i<k+N;i++){            if(tmp<erosion[i])                tmp=erosion[i];        }        dilation[k]=tmp;    }}float closeoperate(float input[]) //閉運算:先膨脹再腐蝕{    int i,k,t;    float tmp;    t=N*2-1;    float dilation[N];    for(k=0;k<N;k++){        tmp=input[k];        for(i=k+1;i<k+N;i++){            if(tmp<input[i])                tmp=input[i];        }        dilation[k]=tmp;    }    tmp=dilation[0];    for(k=1;k<N;k++){        if(tmp>dilation[k])            tmp=dilation[k];    }    return tmp;}int main(){    clock_t start,end;    double duration;    FILE *fd,*m_fd;    float buffer;    float filter_data;    float openresult[2*N-1];    m_fd=fopen("D:/data.txt","r+");    if(m_fd==NULL){        perror("open error!");        return -1;    }    fd=fopen("D:/data1.txt","w+");      if(fd==NULL){        perror("open error!");        return -1;    }    start=clock();    while(fscanf(m_fd,"%f",&buffer)!=EOF){          x[3*N+1]=buffer;          openoperate(x,openresult);          filter_data=closeoperate(openresult);          fprintf(fd,"%f ",filter_data);          for(int y=0;y<3*N+1;y++)               x[y]=x[y+1];    }    end=clock();    duration=(double)(end-start)/CLOCKS_PER_SEC;    printf("%f seconds\n",duration);    fclose(fd);    fclose(m_fd);    return 0;}

結果如所示,對有幹擾原始眼電資料進行形態學濾波處理,其中結構元素17個,窗寬5.有圖可以看到,形態學對於尖峰的濾波效果特別明顯。

圖二,將形態學濾波演算法加入Qt中,對眼電進行即時濾波處理,效果

【引】這部分內容主要來自參考文獻2

總結

以前認為形態學濾波只在影像處理中有所應用,現在看了參考文獻2,才發覺自己實在有點固步自封,對知識的來龍去脈掌握的不夠清楚,一言以蔽之,囫圇吞棗,並不清楚思考方向,而只掌握具體的技巧細節,不注重頂層設計,所以才會有此感慨。

在進行資料處理中,常常用到的濾波方法有中值濾波,均值濾波,FIR,IIR,卡爾曼濾波,自適應濾波等。而很多知識都是相符相通的,切不可死學死記。

參考文獻:
1. http://blog.csdn.net/thefutureisour/article/details/7574819
2. http://m.blog.csdn.net/blog/gylltq/33799347
3. OpenCV 2 電腦視覺編程手冊

2015-11-28 學習筆記 張朋藝

【電腦視覺】形態學濾波

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.