亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? imagemanip.c

?? 基于C開發的指紋識別源程序.rar
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*############################################################################# * 文件名:imagemanip.c * 功能:  實現了主要的圖像處理操作 * modified by  PRTsinghua@hotmail.com#############################################################################*/#include <math.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#include "imagemanip.h"#ifndef min#define min(a,b) (((a)<(b))?(a):(b))#endif/* 宏定義 */#define PIJKL p[i+k + (j+l)*nSizeX]/******************************************************************************  * 功能:圖像縮放操作  * 參數:image       指紋圖像  *       size        縮放的圖像塊大小  *       tolerance   消去直方圖的邊界  * 返回:錯誤編號******************************************************************************/FvsError_t ImageLocalStretch(FvsImage_t image, const FvsInt_t size, 						const FvsInt_t tolerance){    /* 定義一些變量 */    int nSizeX = ImageGetWidth(image)  - size + 1;    int nSizeY = ImageGetHeight(image) - size + 1;    FvsInt_t i, j, t, l;    FvsInt_t sum, denom;    FvsByte_t a = 0;    FvsInt_t k = 0;    FvsByte_t b = 255;    int hist[256];    FvsByte_t* p = ImageGetBuffer(image);    if (p==NULL)    	return FvsMemory;    for (j=0; j < nSizeY; j+=size)    {        for (i=0; i < nSizeX; i+=size)        {            /* 計算直方圖 */            memset(hist, 0, 256*sizeof(int));            for (l = 0; l<size; l++)                for (k = 0; k<size; k++)                    hist[PIJKL]++;                        /* 伸縮 */            for (k=0,   sum=0;   k <256; k++)            {                sum+=hist[k];                a = (FvsByte_t)k;                if (sum>tolerance) break;            }                        for (k=255, sum=0; k >= 0; k--)            {                sum+=hist[k];                b = (FvsByte_t)k;                if (sum>tolerance) break;            }            denom = (FvsInt_t)(b-a);            if (denom!=0)            {                for (l = 0; l<size; l++)                {                    for (k = 0; k<size; k++)                    {                        if (PIJKL<a) PIJKL = a;                        if (PIJKL>b) PIJKL = b;                        t = (FvsInt_t)((((PIJKL)-a)*255)/denom);                        PIJKL = (FvsByte_t)(t);                    }                }            }        }    }    return FvsOK;}#define P(x,y)      ((int32_t)p[(x)+(y)*pitch])/******************************************************************************** 估算脊線的方向** 給定一個歸一化的指紋圖像,算法的主要步驟如下:**** 1 - 將G分成大小為 w x w - (15 x 15) 的塊;**** 2 - 計算每個象素 (i,j)的梯度 dx(i,j) 和 dy(i,j) ,**     根據計算的需求,梯度算子可以從簡單的Sobel算子到復雜的Marr-Hildreth 算子。**** 3 - 估算優勢方向(i,j), 使用如下的操作:****               i+w/2 j+w/2**               ---   --- **               \     \**     Nx(i,j) =  --    -- 2 dx(u,v) dy(u,v)**               /     /**               ---   ---**            u=i-w/2 v=j-w/2****               i+w/2 j+w/2**               ---   --- **               \     \**     Ny(i,j) =  --    -- dx(u,v) - dy(u,v)**               /     /**               ---   ---**            u=i-w/2 v=j-w/2****                  1    -1  / Nx(i,j) \**     Theta(i,j) = - tan   |  -------  |**                  2        \ Ny(i,j) /****     這里,Theta(i,j)是局部脊線方向的最小方差估計,以像素 (i,j) 為中心。**     從數學的角度看,它代表傅立葉頻譜中直角占有時的方向。**** 4 - 由于有噪聲,脊線的中斷,細節點等等的存在,在輸入圖像中,對局部脊線**     方向的估計并不總是正確的。由于局部脊線方向變化緩慢,所以可以用低通**     濾波器來修正不正確的脊線方向。為了運用低通濾波器,方向圖必須轉換成**     連續的矢量域,定義如下:**       Phi_x(i,j) = cos( 2 x theta(i,j) )**       Phi_y(i,j) = sin( 2 x theta(i,j) )**     在矢量域,可以用如下的卷積低通濾波:**       Phi2_x(i,j) = (W @ Phi_x) (i,j)**       Phi2_y(i,j) = (W @ Phi_y) (i,j)**     W是一個二維的低通濾波器。**** 5 - 用如下公式計算 (i,j) 處的方向:****              1    -1  / Phi2_y(i,j) \**     O(i,j) = - tan   |  -----------  |**              2        \ Phi2_x(i,j) /**** 用這個算法可以得到相當平滑的方向圖***/static FvsError_t FingerprintDirectionLowPass(FvsFloat_t* theta, 					FvsFloat_t* out, FvsInt_t nFilterSize, 					FvsInt_t w, FvsInt_t h){    FvsError_t nRet = FvsOK;    FvsFloat_t* filter = NULL;    FvsFloat_t* phix   = NULL;    FvsFloat_t* phiy   = NULL;    FvsFloat_t* phi2x  = NULL;    FvsFloat_t* phi2y  = NULL;    FvsInt_t fsize  = nFilterSize*2+1;    size_t nbytes = (size_t)(w*h*sizeof(FvsFloat_t));    FvsFloat_t nx, ny;    FvsInt_t val;    FvsInt_t i, j, x, y;    filter= (FvsFloat_t*)malloc((size_t)fsize*fsize*sizeof(FvsFloat_t));    phix  = (FvsFloat_t*)malloc(nbytes);    phiy  = (FvsFloat_t*)malloc(nbytes);    phi2x = (FvsFloat_t*)malloc(nbytes);    phi2y = (FvsFloat_t*)malloc(nbytes);    if (filter==NULL || phi2x==NULL || phi2y==NULL || phix==NULL || phiy==NULL)        nRet = FvsMemory;    else    {        /* 置 0 */        memset(filter, 0, (size_t)fsize*fsize*sizeof(FvsFloat_t));        memset(phix,   0, nbytes);        memset(phiy,   0, nbytes);        memset(phi2x,  0, nbytes);        memset(phi2y,  0, nbytes);        /* 步驟4 */        for (y = 0; y < h; y++)        for (x = 0; x < w; x++)        {            val = x+y*w;            phix[val] = cos(theta[val]);            phiy[val] = sin(theta[val]);        }        /* 構造低通濾波器 */        nx = 0.0;        for (j = 0; j < fsize; j++)        for (i = 0; i < fsize; i++)        {            filter[j*fsize+i] = 1.0;            nx += filter[j*fsize+i]; /* 系數和 */        }        if (nx>1.0)        {            for (j = 0; j < fsize; j++)            for (i = 0; i < fsize; i++)                /* 歸一化結果 */                filter[j*fsize+i] /= nx;        }        /* 低通濾波 */        for (y = 0; y < h-fsize; y++)        for (x = 0; x < w-fsize; x++)        {            nx = 0.0;            ny = 0.0;            for (j = 0; j < fsize; j++)            for (i = 0; i < fsize; i++)            {                val = (x+i)+(j+y)*w;                nx += filter[j*fsize+i]*phix[val];                ny += filter[j*fsize+i]*phiy[val];            }            val = x+y*w;            phi2x[val] = nx;            phi2y[val] = ny;        }        /* 銷毀 phix, phiy */        if (phix!=NULL)         {         	free(phix);         	phix=NULL;         }        if (phiy!=NULL)         {         	free(phiy);         	phiy=NULL;         }        /* 步驟5 */        for (y = 0; y < h-fsize; y++)        for (x = 0; x < w-fsize; x++)        {            val = x+y*w;            out[val] = atan2(phi2y[val], phi2x[val])*0.5;        }    }    if (phix!=NULL)  free(phix);    if (phiy!=NULL)  free(phiy);    if (phi2x!=NULL) free(phi2x);    if (phi2y!=NULL) free(phi2y);    if (filter!=NULL)free(filter);    return nRet;}/******************************************************************************  * 功能:計算指紋圖像脊線的方向。          該算法在許多論文中都有描述,如果圖像做了歸一化,并且對比度較高,          則最后的處理效果也較好。          方向的值在-PI/2和PI/2之間,弧度和脊并不相同。          選取的塊越大,分析的效果也越好,但所需的處理計算時間也越長。          由于指紋圖像中脊線方向的變化比較緩慢,所以低通濾波器可以較好的          過慮掉方向中的噪聲和錯誤。  * 參數:image          指向圖像對象的指針  *       field          指向浮點域對象的指針,保存結果  *       nBlockSize     塊大小  *       nFilterSize    濾波器大小  * 返回:錯誤編號******************************************************************************/FvsError_t FingerprintGetDirection(const FvsImage_t image, 						FvsFloatField_t field, const FvsInt_t nBlockSize, 						const FvsInt_t nFilterSize){    /* 輸入圖像的寬度和高度 */    FvsInt_t w       = ImageGetWidth (image);    FvsInt_t h       = ImageGetHeight(image);    FvsInt_t pitch   = ImageGetPitch (image);    FvsByte_t* p     = ImageGetBuffer(image);    FvsInt_t i, j, u, v, x, y;    FvsFloat_t dx[(nBlockSize*2+1)][(nBlockSize*2+1)];    FvsFloat_t dy[(nBlockSize*2+1)][(nBlockSize*2+1)];    FvsFloat_t nx, ny;    FvsFloat_t* out;    FvsFloat_t* theta  = NULL;    FvsError_t nRet = FvsOK;    /* 輸出圖像 */    nRet = FloatFieldSetSize(field, w, h);    if (nRet!=FvsOK) return nRet;    nRet = FloatFieldClear(field);    if (nRet!=FvsOK) return nRet;    out = FloatFieldGetBuffer(field);    /* 為方向數組申請內存 */    if (nFilterSize>0)    {        theta = (FvsFloat_t*)malloc(w * h * sizeof(FvsFloat_t));        if (theta!=NULL)            memset(theta, 0, (w * h * sizeof(FvsFloat_t)));    }    /* 內存錯誤,返回 */    if (out==NULL || (nFilterSize>0 && theta==NULL))        nRet = FvsMemory;    else    {        /* 1 - 圖像分塊 */        for (y = nBlockSize+1; y < h-nBlockSize-1; y++)        for (x = nBlockSize+1; x < w-nBlockSize-1; x++)        {            /* 2 - 計算梯度 */            for (j = 0; j < (nBlockSize*2+1); j++)            for (i = 0; i < (nBlockSize*2+1); i++)            {                dx[i][j] = (FvsFloat_t)                           (P(x+i-nBlockSize,   y+j-nBlockSize) -                            P(x+i-nBlockSize-1, y+j-nBlockSize));                dy[i][j] = (FvsFloat_t)                           (P(x+i-nBlockSize,   y+j-nBlockSize) -                            P(x+i-nBlockSize,   y+j-nBlockSize-1));            }            /* 3 - 計算方向 */            nx = 0.0;            ny = 0.0;            for (v = 0; v < (nBlockSize*2+1); v++)            for (u = 0; u < (nBlockSize*2+1); u++)            {                nx += 2 * dx[u][v] * dy[u][v];                ny += dx[u][v]*dx[u][v] - dy[u][v]*dy[u][v];            }            /* 計算角度 (-pi/2 .. pi/2) */            if (nFilterSize>0)                theta[x+y*w] = atan2(nx, ny);            else                out[x+y*w] = atan2(nx, ny)*0.5;        }        if (nFilterSize>0)            nRet = FingerprintDirectionLowPass(theta, out, nFilterSize, w, h);    }    if (theta!=NULL) free(theta);    return nRet;}/* 指紋頻率域 *//******************************************************************************** 這個步驟里,我們估計指紋脊線的頻率。在局部鄰域里,沒有凸現的細節點或者孤點,** 沿著脊線和谷底,可以用一個正弦曲線波形作為模型,因此,局部脊線頻率是指紋圖** 像的另一個本質的特征。對指紋圖像G進行歸一化,O是其方向圖,估算局部脊線頻率** 的步驟如下:**** 1 - 圖像分塊 w x w - (16 x 16)**** 2 - 對每塊,計算大小為l x w (32 x 16)的方向圖窗口**** 3 - 對中心在 (i,j) 的每塊, 計算脊線和谷底的 x-signature**     X[0], X[1], ... X[l-1] 采用如下公式:****              --- w-1**            1 \**     X[k] = -  --  G (u, v), k = 0, 1, ..., l-1**            w /**              --- d=0****     u = i + (d - w/2).cos O(i,j) + (k - l/2).sin O(i,j)****     v = j + (d - w/2).sin O(i,j) - (k - l/2).cos O(i,j)****     如果方向圖窗口中沒有細節點和孤立的點,則x-signature形成了一個離散**     的正弦曲線波,與方向圖中脊線和谷底的頻率一樣。因此,脊線和谷底的**     頻率可以由x-signature來估計。設T(i,j)是兩個峰頂的平均距離,則頻率**     OHM(i,j)可以這樣計算:OHM(i,j) = 1 / T(i,j)。****     如果沒有兩個連續的峰頂,則頻率置為-1,說明其無效。**** 4 - 對于一個指紋圖像而言,脊線頻率的值在一個范圍之內變動,比如說對于500**     dpi的圖像,變動范圍為[1/3, 1/25],因此,如果估計出的頻率不在這個范**     圍內,說明頻率估計無效,同意置為-1。**** 5 - 如果某塊有斷點或者細節點,則不會有正弦曲線,其頻率可以由鄰塊的頻率**     插值估計(比如說高斯函數,均值為0,方差為9,寬度為7)。**** 6 - 脊線內部距離變化緩慢,可以用低通濾波器***//* 寬度 */#define BLOCK_W     16#define BLOCK_W2     8/* 長度 */#define BLOCK_L     32#define BLOCK_L2    16#define EPSILON     0.0001#define LPSIZE      3#define LPFACTOR    (1.0/((LPSIZE*2+1)*(LPSIZE*2+1)))FvsError_t FingerprintGetFrequency(const FvsImage_t image, const FvsFloatField_t direction,           FvsFloatField_t frequency){    /* 輸入圖像的寬度和高度 */    FvsError_t nRet = FvsOK;    FvsInt_t w      = ImageGetWidth (image);    FvsInt_t h      = ImageGetHeight(image);    FvsInt_t pitchi = ImageGetPitch (image);    FvsByte_t* p    = ImageGetBuffer(image);    FvsFloat_t* out;    FvsFloat_t* freq;    FvsFloat_t* orientation = FloatFieldGetBuffer(direction);    FvsInt_t x, y, u, v, d, k;    size_t size;    if (p==NULL)        return FvsMemory;    /* 輸出圖像的內存申請 */    nRet = FloatFieldSetSize(frequency, w, h);    if (nRet!=FvsOK) return nRet;    (void)FloatFieldClear(frequency);    freq = FloatFieldGetBuffer(frequency);    if (freq==NULL)        return FvsMemory;    /* 輸出的內存申請 */    size = w*h*sizeof(FvsFloat_t);    out  = (FvsFloat_t*)malloc(size);    if (out!=NULL)    {        FvsFloat_t dir = 0.0;        FvsFloat_t cosdir = 0.0;        FvsFloat_t sindir = 0.0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美另类z0zxhd电影| 久久久久久久综合色一本| 国产精选一区二区三区| 精品国产3级a| 国产日韩欧美麻豆| 五月天久久比比资源色| 97se亚洲国产综合自在线不卡| 日韩一区二区视频| 亚洲国产你懂的| www.在线成人| 欧美经典一区二区| 激情综合色播激情啊| 91精品黄色片免费大全| 一区二区久久久久久| 97se亚洲国产综合自在线| 日本一区二区三区四区在线视频| 久久国内精品视频| 欧美日韩国产精品自在自线| 亚洲精品国产精品乱码不99| 成人中文字幕在线| 国产欧美日产一区| 国产一区二区导航在线播放| 日韩美女视频一区二区在线观看| 天天爽夜夜爽夜夜爽精品视频| 欧洲另类一二三四区| 亚洲资源在线观看| 在线国产电影不卡| 亚洲综合在线五月| 欧美婷婷六月丁香综合色| 洋洋成人永久网站入口| 在线视频一区二区三| 亚洲激情校园春色| 一本到三区不卡视频| 国产精品久久久久久久第一福利| 国产伦精品一区二区三区免费迷| 国产亚洲一区二区在线观看| 国产91富婆露脸刺激对白| 国产三级三级三级精品8ⅰ区| 国产成人午夜99999| 欧美经典一区二区三区| av在线播放不卡| 亚洲私人黄色宅男| 欧美三区免费完整视频在线观看| 肉丝袜脚交视频一区二区| 欧美一区二区福利在线| 国内精品伊人久久久久av影院 | 欧美刺激午夜性久久久久久久| 日韩高清不卡一区二区三区| 91精品久久久久久久久99蜜臂| 精品一区二区综合| 日本一区二区三区电影| 一本色道**综合亚洲精品蜜桃冫| 亚洲在线成人精品| 一本久久精品一区二区| 日韩成人免费在线| 久久久精品蜜桃| 波多野洁衣一区| 亚洲大型综合色站| 日韩精品一区二| 99精品视频一区二区三区| 亚洲一区二区三区在线播放| 日韩欧美国产系列| 成人精品一区二区三区中文字幕| 一区二区三区不卡在线观看| 2023国产一二三区日本精品2022| 不卡av电影在线播放| 亚洲国产精品一区二区久久| 精品福利一二区| 一本一道综合狠狠老| 日本欧美肥老太交大片| 国产精品视频线看| 8x8x8国产精品| av电影在线观看完整版一区二区| 日精品一区二区三区| 国产精品色噜噜| 91麻豆精品国产91久久久久久久久| 国产传媒欧美日韩成人| 日韩在线一区二区| 亚洲三级视频在线观看| 日韩欧美在线影院| 色猫猫国产区一区二在线视频| 精品一区二区三区av| 亚洲一区中文在线| 国产精品久久久久久久久图文区| 日韩欧美激情四射| 欧美亚洲一区二区在线| 成人网在线免费视频| 久久精品国产在热久久| 亚洲va欧美va人人爽| 综合在线观看色| 久久综合九色综合97_久久久| 欧美日韩一区小说| 色综合天天综合狠狠| 国产成人a级片| 精品一二线国产| 免费观看91视频大全| 亚洲成a人v欧美综合天堂| 亚洲精品国产高清久久伦理二区| 欧美激情一区二区三区全黄| 精品精品国产高清一毛片一天堂| 欧美日韩一二三| 一道本成人在线| 色综合久久天天| www.亚洲色图.com| 菠萝蜜视频在线观看一区| 成人免费毛片aaaaa**| 国产一区二区三区香蕉| 国产在线一区二区综合免费视频| 男男成人高潮片免费网站| 亚洲国产精品久久久久婷婷884 | 另类人妖一区二区av| 日本欧美加勒比视频| 日韩激情一区二区| 日本中文在线一区| 免费欧美在线视频| 蜜臀精品久久久久久蜜臀| 丝袜亚洲精品中文字幕一区| 日精品一区二区三区| 欧美a一区二区| 蜜臀a∨国产成人精品| 欧美aaaaaa午夜精品| 激情综合一区二区三区| 狠狠色丁香婷婷综合久久片| 黄一区二区三区| 国产不卡视频在线播放| 99久久777色| 91高清视频免费看| 欧美一区二区久久| 精品国产凹凸成av人导航| 国产日韩成人精品| 亚洲色大成网站www久久九九| 亚洲精品日韩一| 天天影视色香欲综合网老头| 精品一区二区三区免费毛片爱| 风流少妇一区二区| 日本久久电影网| 欧美二区在线观看| 久久久久久久一区| 亚洲人成网站影音先锋播放| 亚洲成a人在线观看| 国产自产2019最新不卡| 色婷婷综合久久久久中文一区二区| 欧美综合一区二区| 欧美一级日韩不卡播放免费| 国产女主播视频一区二区| 一区二区三区中文在线观看| 亚洲第一激情av| 国产在线观看一区二区| av一区二区三区在线| 777午夜精品视频在线播放| 国产亚洲欧美一级| 亚洲成人av一区| 岛国精品在线观看| 欧美日韩国产bt| 国产欧美一区二区精品忘忧草| 一区二区三区国产豹纹内裤在线| 老司机精品视频线观看86| av不卡在线播放| 日韩精品一区二区三区视频在线观看| 国产精品久久三区| 日本少妇一区二区| 91麻豆国产精品久久| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 成人18视频日本| 欧美一区二区精品久久911| 亚洲欧美综合在线精品| 久久精品国产一区二区| 在线观看日韩高清av| 欧美极品少妇xxxxⅹ高跟鞋| 婷婷开心久久网| 色偷偷久久人人79超碰人人澡| 欧美精品一区二区三区在线 | 国产精品欧美一区二区三区| 蜜臀久久99精品久久久久宅男| 91精品办公室少妇高潮对白| 久久久精品国产免大香伊| 秋霞午夜鲁丝一区二区老狼| 色素色在线综合| 中文字幕一区二区三区蜜月| 国产中文一区二区三区| 91麻豆精品国产91久久久更新时间| 亚洲欧洲国产日本综合| 国产一区二区三区免费看| 欧美一区二区在线观看| 亚洲一区国产视频| 91国在线观看| 亚洲女同女同女同女同女同69| 成人免费高清视频| 欧美韩国日本综合| 国产伦精品一区二区三区免费| 欧美电影免费观看高清完整版在线| 午夜a成v人精品| 欧美探花视频资源| 亚洲国产成人91porn| 欧美三级韩国三级日本一级| 亚洲一区二区美女| 欧美日韩国产bt| 男女男精品网站| 欧美电影免费观看高清完整版在| 蜜臀久久99精品久久久画质超高清|