图像处理之中值滤波介绍及C实现
1?中值濾波概述
中值濾波是基于排序統(tǒng)計(jì)理論的一種能有效抑制噪聲的非線性信號(hào)平滑處理技術(shù),它將每一像素點(diǎn)的灰度值設(shè)置為該點(diǎn)某鄰域窗口內(nèi)的所有像素點(diǎn)灰度值的中值。
中值濾波的基本原理是把數(shù)字圖像或數(shù)字序列中一點(diǎn)的值用該點(diǎn)的一個(gè)鄰域中各點(diǎn)值的中值代替,讓周圍的像素值接近的真實(shí)值,從而消除孤立的噪聲點(diǎn)。方法是用某種結(jié)構(gòu)的二維滑動(dòng)模板,將板內(nèi)像素按照像素值的大小進(jìn)行排序,生成單調(diào)上升(或下降)的為二維數(shù)據(jù)序列。二維中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l∈W)}?,其中,f(x,y),g(x,y)分別為原始圖像和處理后圖像。W為二維模板,通常為3*3,5*5區(qū)域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環(huán)形等。
2?中值濾波算法原理
中值濾波數(shù)學(xué)實(shí)現(xiàn):對(duì)一個(gè)數(shù)字信號(hào)序列xj(-∞<j<∞)進(jìn)行濾波處理時(shí),首先要定義一個(gè)長(zhǎng)度為奇數(shù)的L長(zhǎng)窗口,L=2N+1,N為正整數(shù)。設(shè)在某一個(gè)時(shí)刻,窗口內(nèi)的信號(hào)樣本為x(i-N),…,x(i),…,x(i+N),其中x(i)為位于窗口中心的信號(hào)樣本值。對(duì)這L個(gè)信號(hào)樣本值按從小到大的順序排列后,其中值,在i處的樣值,便定義為中值濾波的輸出值。
在實(shí)際應(yīng)用中,隨著所選用窗口長(zhǎng)度的增加,濾波的計(jì)算量將會(huì)迅速增加。因此,尋求中值濾波的快速算法,是中值濾波理論的一個(gè)重要研究?jī)?nèi)容。中值濾波的快速算法,一般采用下述三種方式:①直方圖數(shù)據(jù)修正法;②樣本值二進(jìn)制表示邏輯判斷法;③數(shù)字和模擬的選擇網(wǎng)絡(luò)法。
對(duì)中值濾波的理論研究,還集中于統(tǒng)計(jì)特性分析和根序列的描述方面。當(dāng)一個(gè)信號(hào)序列經(jīng)一特定窗口長(zhǎng)度的中值濾波反復(fù)處理后,它會(huì)收斂于某一個(gè)不再變化的序列,這個(gè)序列稱為中值濾波的根序列。根序列是描述中值濾波特性的一個(gè)重要概念。通過對(duì)根序列結(jié)構(gòu)的研究,可以確定原信號(hào)序列中,哪些成分可以經(jīng)中值濾波后保留下來,哪些成分將被抑制。這對(duì)確定中值濾波器的窗口長(zhǎng)度,提供了重要依據(jù)。用VLSI實(shí)現(xiàn)的中值濾波器芯片,可供實(shí)時(shí)處理中應(yīng)用。
3?中值濾波算法流程
?
4?中值濾波應(yīng)用及優(yōu)勢(shì)
中值濾波法對(duì)消除椒鹽噪聲非常有效,在光學(xué)測(cè)量條紋圖象的相位分析處理方法中有特殊作用,但在條紋中心分析方法中作用不大.
中值濾波在圖像處理中,常用于保護(hù)邊緣信息,是經(jīng)典的平滑噪聲的方法。
5?中值濾波代碼實(shí)現(xiàn)
?
1 // zhongzhilvbo.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 2 // 3 4 #include <stdio.h> 5 #include <math.h> 6 #include <memory.h> 7 #include <conio.h> 8 #include <stdlib.h> 9 #include <windows.h> 10 #include "stdafx.h" 11 //原圖象的寬度和高度 12 #define width 352 13 #define higth 288 14 15 int lvbo(unsigned char D[9]) 16 { 17 unsigned int temp; 18 int i,j; 19 20 for(i=0;i<9;i++) 21 { 22 for(j=0;j<9-i;j++) 23 { 24 if(D[i]>D[j+1]) 25 { 26 temp=D[i]; 27 D[i]=D[j+1]; 28 D[j+1]=temp; 29 } 30 } 31 } 32 33 return D[4]; 34 } 35 36 void main() 37 { 38 FILE *fp,*newfp; 39 int i,j; 40 41 if(!(fp=fopen("fmh1.bmp","rb"))) 42 { 43 printf("Open file %s error!\n","k.bmp"); 44 return ; 45 } 46 47 if(!(newfp=fopen("fmout.bmp","wb"))) 48 { 49 printf("Open file %s error!\n","result.bmp"); 50 return ; 51 } 52 53 unsigned char buffer[54+1024];//定義原圖像頭緩沖區(qū) 54 fread(buffer,1,54+1024,fp);//讀取文件頭54個(gè)字節(jié) 55 56 unsigned long length=width*higth;//圖像的總象素個(gè)數(shù) 57 unsigned char readData[higth][width]; //用于存儲(chǔ)原圖數(shù)據(jù)的數(shù)組 58 unsigned char writeData[higth][width]; //用于存儲(chǔ)原圖數(shù)據(jù)的數(shù)組 59 60 fread(&readData[0][0], sizeof(unsigned char),length, fp);//從原圖讀入數(shù)據(jù) 61 62 for(i=0;i<higth;i++) 63 { 64 for(j=0;j<width;j++) 65 { 66 writeData[i][j]=readData[i][j]; 67 } 68 } 69 70 unsigned char D[9]; //定義選取框 71 for(i=1;i<higth-1;i++) 72 { 73 for(j=1;j<width-1;j++) 74 { 75 D[0]=readData[i-1][j+1]; 76 D[1]=readData[i][j+1]; 77 D[2]=readData[i+1][j+1]; 78 D[3]=readData[i-1][j]; 79 D[4]=readData[i][j]; 80 D[5]=readData[i+1][j]; 81 D[6]=readData[i-1][j-1]; 82 D[7]=readData[i][j-1]; 83 D[8]=readData[i+1][j-1]; 84 writeData[i][j]=lvbo(D); 85 } 86 } 87 88 fwrite(buffer,sizeof(unsigned char),54+1024,newfp); 89 fwrite(writeData,sizeof(unsigned char),length,newfp); 90 fclose(newfp); 91 fclose(fp); 92 93 return ; 94 }?
經(jīng)過中值濾波處理后的對(duì)比圖片:
??
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的图像处理之中值滤波介绍及C实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像滤波之高斯滤波介绍
- 下一篇: 图像处理之均值滤波介绍及C算法实现