?? img_enhance.c
字號(hào):
/*############################################################################# * 文件名:imageenhance.c * 功能: 實(shí)現(xiàn)了圖像增強(qiáng)算法 * modified by PRTsinghua@hotmail.com#############################################################################*/#include <math.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#include "imagemanip.h"/******************************************************************************** 圖像增強(qiáng)部分** ** 該增強(qiáng)算法針對(duì)指紋圖像設(shè)計(jì),它標(biāo)記了指紋圖像中沒有使用的區(qū)域,而其它的區(qū)域** 在增強(qiáng)后,脊線可以被清晰的分離出來(使用一個(gè)閾值)。** ** 該算法生成了一個(gè)脊線方向圖,一個(gè)掩碼圖。**** 可參考如下兩篇文章:** 1 - Fingerprint Enhancement: Lin Hong, Anil Jain, Sharathcha Pankanti,** and Ruud Bolle. [Hong96]** 2 - Fingerprint Image Enhancement, Algorithm and Performance Evaluation:** Lin Hong, Yifei Wan and Anil Jain. [Hong98]**** 增強(qiáng)算法使用了 文獻(xiàn)(2) 中的幾個(gè)步驟:** A - 歸一化** B - 計(jì)算方向圖** C - 計(jì)算頻率** D - 計(jì)算區(qū)域掩碼** E - 濾波********************************************************************************/#define P(x,y) ((int32_t)p[(x)+(y)*pitch])/******************************************************************************** 采用了Gabor方向?yàn)V波器,如下:**** / 1|x' y' |\** h(x,y:phi,f) = exp|- -|--- + ---| |.cos(2.PI.f.x')** \ 2|dx dy |/**** x' = x.cos(phi) + y.sin(phi)** y' = -x.sin(phi) + y.cos(phi)**** 定義如下:** G 歸一化后的圖像** O 方向圖** F 頻率圖** R 掩碼圖像** E 增強(qiáng)后的圖像** Wg Gabor濾波器窗口大小**** / 255 if R(i,j) = 0** |** | Wg/2 Wg/2 ** | --- ---** E(i,j)= | \ \** | -- -- h(u,v:O(i,j),F(i,j)).G(i-u,j-v) otherwise** | / /** \ --- ---** u=-Wg/2 v=-Wg/2********************************************************************************/inline FvsFloat_t EnhanceGabor(FvsFloat_t x, FvsFloat_t y, FvsFloat_t phi, FvsFloat_t f, FvsFloat_t r2){ FvsFloat_t dy2 = 1.0/r2; FvsFloat_t dx2 = 1.0/r2; FvsFloat_t x2, y2; phi += M_PI/2; x2 = -x*sin(phi) + y*cos(phi); y2 = x*cos(phi) + y*sin(phi); return exp(-0.5*(x2*x2*dx2 + y2*y2*dy2))*cos(2*M_PI*x2*f);}static FvsError_t ImageEnhanceFilter ( FvsImage_t normalized, const FvsImage_t mask, const FvsFloat_t* orientation, const FvsFloat_t* frequence, FvsFloat_t radius ){ FvsInt_t Wg2 = 8; FvsInt_t i,j, u,v; FvsError_t nRet = FvsOK; FvsImage_t enhanced = NULL; FvsInt_t w = ImageGetWidth (normalized); FvsInt_t h = ImageGetHeight(normalized); FvsInt_t pitchG = ImageGetPitch (normalized); FvsByte_t* pG = ImageGetBuffer(normalized); FvsFloat_t sum, f, o; /* 平方 */ radius = radius*radius; enhanced = ImageCreate(); if (enhanced==NULL || pG==NULL) return FvsMemory; if (nRet==FvsOK) nRet = ImageSetSize(enhanced, w, h); if (nRet==FvsOK) { FvsInt_t pitchE = ImageGetPitch (enhanced); FvsByte_t* pE = ImageGetBuffer(enhanced); if (pE==NULL) return FvsMemory; (void)ImageClear(enhanced); for (j = Wg2; j < h-Wg2; j++) for (i = Wg2; i < w-Wg2; i++) { if (mask==NULL || ImageGetPixel(mask, i, j)!=0) { sum = 0.0; o = orientation[i+j*w]; f = frequence[i+j*w]; for (v = -Wg2; v <= Wg2; v++) for (u = -Wg2; u <= Wg2; u++) { sum += EnhanceGabor ( (FvsFloat_t)u, (FvsFloat_t)v, o,f,radius ) * pG[(i-u)+(j-v)*pitchG]; } if (sum>255.0) sum = 255.0; if (sum<0.0) sum = 0.0; pE[i+j*pitchE] = (uint8_t)sum; } } nRet = ImageCopy(normalized, enhanced); } (void)ImageDestroy(enhanced); return nRet;}/* }}} *//****************************************************************************** * 功能:指紋圖像增強(qiáng)算法 * 該算法描述起來比較復(fù)雜,其后處理的部分是基于Gabor濾波器的, 參數(shù)動(dòng)態(tài)計(jì)算。圖像處理時(shí)參數(shù)依次改變,所以要做一個(gè)原圖的備份。 * 參數(shù):image 指紋圖像 * direction 脊線方向,需要事先計(jì)算 * frequency 脊線頻率,需要事先計(jì)算 * mask 指示指紋的有效區(qū)域 * radius 濾波器半徑,大多數(shù)情況下,4.0即可。 值越大,噪聲可以受到更大抑制,但會(huì)產(chǎn)生更多的偽特征。 * 返回:錯(cuò)誤編號(hào)******************************************************************************/FvsError_t ImageEnhanceGabor(FvsImage_t image, const FvsFloatField_t direction, const FvsFloatField_t frequency, const FvsImage_t mask, const FvsFloat_t radius){ FvsError_t nRet = FvsOK; FvsFloat_t * image_orientation = FloatFieldGetBuffer(direction); FvsFloat_t * image_frequence = FloatFieldGetBuffer(frequency); if (image_orientation==NULL || image_frequence==NULL) return FvsMemory; nRet = ImageEnhanceFilter(image, mask, image_orientation, image_frequence, radius); return nRet;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -