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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? imagemanip.c

?? 指紋識別 C代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*############################################################################# * 文件名:imagemanip.c * 功能:  實現(xiàn)了主要的圖像處理操作 * 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]/******************************************************************************  * 功能:圖像縮放操作  * 參數(shù):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) ,**     根據(jù)計算的需求,梯度算子可以從簡單的Sobel算子到復雜的Marr-Hildreth 算子。**** 3 - 估算優(yōu)勢方向(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) 為中心。**     從數(shù)學的角度看,它代表傅立葉頻譜中直角占有時的方向。**** 4 - 由于有噪聲,脊線的中斷,細節(jié)點等等的存在,在輸入圖像中,對局部脊線**     方向的估計并不總是正確的。由于局部脊線方向變化緩慢,所以可以用低通**     濾波器來修正不正確的脊線方向。為了運用低通濾波器,方向圖必須轉(zhuǎn)換成**     連續(xù)的矢量域,定義如下:**       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]);        }        /* 構(gòu)造低通濾波器 */        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]; /* 系數(shù)和 */        }        if (nx>1.0)        {            for (j = 0; j < fsize; j++)            for (i = 0; i < fsize; i++)                /* 歸一化結(jié)果 */                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之間,弧度和脊并不相同。          選取的塊越大,分析的效果也越好,但所需的處理計算時間也越長。          由于指紋圖像中脊線方向的變化比較緩慢,所以低通濾波器可以較好的          過慮掉方向中的噪聲和錯誤。  * 參數(shù):image          指向圖像對象的指針  *       field          指向浮點域?qū)ο蟮闹羔槪4娼Y(jié)果  *       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);    /* 為方向數(shù)組申請內(nèi)存 */    if (nFilterSize>0)    {        theta = (FvsFloat_t*)malloc(w * h * sizeof(FvsFloat_t));        if (theta!=NULL)            memset(theta, 0, (w * h * sizeof(FvsFloat_t)));    }    /* 內(nèi)存錯誤,返回 */    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;}/* 指紋頻率域 *//******************************************************************************** 這個步驟里,我們估計指紋脊線的頻率。在局部鄰域里,沒有凸現(xiàn)的細節(jié)點或者孤點,** 沿著脊線和谷底,可以用一個正弦曲線波形作為模型,因此,局部脊線頻率是指紋圖** 像的另一個本質(zhì)的特征。對指紋圖像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)****     如果方向圖窗口中沒有細節(jié)點和孤立的點,則x-signature形成了一個離散**     的正弦曲線波,與方向圖中脊線和谷底的頻率一樣。因此,脊線和谷底的**     頻率可以由x-signature來估計。設(shè)T(i,j)是兩個峰頂?shù)钠骄嚯x,則頻率**     OHM(i,j)可以這樣計算:OHM(i,j) = 1 / T(i,j)。****     如果沒有兩個連續(xù)的峰頂,則頻率置為-1,說明其無效。**** 4 - 對于一個指紋圖像而言,脊線頻率的值在一個范圍之內(nèi)變動,比如說對于500**     dpi的圖像,變動范圍為[1/3, 1/25],因此,如果估計出的頻率不在這個范**     圍內(nèi),說明頻率估計無效,同意置為-1。**** 5 - 如果某塊有斷點或者細節(jié)點,則不會有正弦曲線,其頻率可以由鄰塊的頻率**     插值估計(比如說高斯函數(shù),均值為0,方差為9,寬度為7)。**** 6 - 脊線內(nèi)部距離變化緩慢,可以用低通濾波器***//* 寬度 */#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;    /* 輸出圖像的內(nèi)存申請 */    nRet = FloatFieldSetSize(frequency, w, h);    if (nRet!=FvsOK) return nRet;    (void)FloatFieldClear(frequency);    freq = FloatFieldGetBuffer(frequency);    if (freq==NULL)        return FvsMemory;    /* 輸出的內(nèi)存申請 */    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一区二区三区免费野_久草精品视频
欧美大片在线观看一区二区| 一本到高清视频免费精品| 91麻豆精品国产| 日韩av电影天堂| 欧美一级二级三级乱码| 美女视频免费一区| 日本一区二区在线不卡| www.欧美精品一二区| 一区二区免费在线| 欧美一区二区视频在线观看2020| 美腿丝袜亚洲三区| 国产精品青草综合久久久久99| 99re成人精品视频| 视频一区在线播放| 久久精品视频网| 色偷偷一区二区三区| 亚洲欧洲成人精品av97| 69堂国产成人免费视频| 国产在线播放一区三区四| 91精品国产色综合久久不卡蜜臀| 亚洲大尺度视频在线观看| 国产精品888| 欧美日韩免费观看一区二区三区 | 欧美精品日日鲁夜夜添| 欧美大片在线观看一区| 国产精品你懂的在线欣赏| 一区二区三区精品| 欧美精品在欧美一区二区少妇| 久久国产精品72免费观看| 国产精品每日更新在线播放网址| 在线观看国产日韩| 韩日欧美一区二区三区| 亚洲一区在线电影| 精品国产乱码久久久久久闺蜜| 91福利社在线观看| 国产精品影视网| 香蕉av福利精品导航| 国产精品素人视频| 日韩精品最新网址| 欧美性猛交xxxx黑人交| 国产成人av影院| 美女视频免费一区| 五月综合激情网| 亚洲私人影院在线观看| 国产亚洲欧美激情| 欧美一区二区久久| 欧美亚洲另类激情小说| 成人av先锋影音| 久久er99精品| 青青草原综合久久大伊人精品| 亚洲天堂av一区| 国产欧美日韩精品a在线观看| 4438亚洲最大| 精品视频在线免费观看| 色妹子一区二区| 成a人片国产精品| 天天射综合影视| 亚洲123区在线观看| 亚洲精品国产a| 中文字幕亚洲一区二区va在线| 国产三级一区二区三区| 精品免费国产一区二区三区四区| 欧美高清视频在线高清观看mv色露露十八 | 欧美一级生活片| 欧美午夜免费电影| 91性感美女视频| av不卡在线观看| 久久国产成人午夜av影院| 亚洲激情男女视频| 亚洲欧洲日韩在线| 亚洲国产精品av| 国产在线一区二区综合免费视频| 另类小说视频一区二区| 天天影视色香欲综合网老头| 亚洲最新视频在线观看| 一区二区激情小说| 亚洲国产精品影院| 午夜视频久久久久久| 午夜av一区二区三区| 免费成人在线影院| 国产一本一道久久香蕉| 国产酒店精品激情| jlzzjlzz亚洲女人18| 成人一区在线看| eeuss鲁一区二区三区| 色吧成人激情小说| 欧美视频在线一区二区三区| 9191精品国产综合久久久久久| 555夜色666亚洲国产免| 日韩三级.com| 国产亚洲一区二区三区在线观看| 欧美激情一区三区| 亚洲免费色视频| 午夜久久久影院| 久久国产三级精品| www.久久精品| 欧美高清www午色夜在线视频| 日韩一区二区三区电影在线观看 | 国产精品日日摸夜夜摸av| 亚洲三级电影网站| 午夜日韩在线电影| 精品一区二区三区香蕉蜜桃| 欧美性猛交xxxxxxxx| 精品国内片67194| 国产精品久久久一本精品| 亚洲一区在线观看视频| 激情伊人五月天久久综合| 成人永久aaa| 69堂精品视频| 亚洲国产高清aⅴ视频| 亚洲一区二区视频在线观看| 激情六月婷婷综合| 色综合久久中文综合久久牛| 欧美精品国产精品| 欧美高清一级片在线观看| 亚洲国产视频a| 粉嫩高潮美女一区二区三区| 欧美在线观看视频一区二区三区| 精品国产99国产精品| 亚洲视频小说图片| 激情五月婷婷综合| 欧美色综合天天久久综合精品| 日韩欧美一二区| 亚洲已满18点击进入久久| 国产一区二区三区四区在线观看 | 欧美日韩一区二区三区四区五区| 欧美videossexotv100| 亚洲欧洲综合另类| 国产精品亚洲一区二区三区妖精 | 亚洲国产一区二区在线播放| 国产精品自拍一区| 91精品国产综合久久蜜臀| 最好看的中文字幕久久| 精品亚洲免费视频| 欧美三区免费完整视频在线观看| 国产日韩欧美在线一区| 日韩和欧美的一区| 色呦呦国产精品| 中文字幕欧美区| 国产麻豆欧美日韩一区| 欧美一区二区三区小说| 亚洲激情一二三区| 不卡的看片网站| 久久综合99re88久久爱| 奇米亚洲午夜久久精品| 欧美日韩久久不卡| 亚洲美女视频在线| 成人av综合在线| 日本一区二区在线不卡| 国产乱理伦片在线观看夜一区| 欧美一级在线观看| 肉丝袜脚交视频一区二区| 色噜噜夜夜夜综合网| 国产精品久久免费看| 成人激情开心网| 午夜精品一区二区三区电影天堂| 成人午夜电影久久影院| 久久九九久久九九| 黄色资源网久久资源365| 日韩欧美国产综合一区| 美女在线一区二区| 欧美一级免费大片| 蜜桃一区二区三区在线观看| 欧美丰满少妇xxxbbb| 午夜精品久久久久久久99樱桃| 91豆麻精品91久久久久久| 亚洲美女视频在线| 日本韩国精品一区二区在线观看| 亚洲丝袜精品丝袜在线| 色婷婷久久久亚洲一区二区三区 | 天堂精品中文字幕在线| 欧美艳星brazzers| 天天射综合影视| 欧美成人aa大片| 久久99精品久久只有精品| 日韩免费视频线观看| 国产麻豆欧美日韩一区| 国产农村妇女毛片精品久久麻豆| 国产69精品一区二区亚洲孕妇| 国产精品污污网站在线观看| 成人国产精品免费观看动漫| 亚洲天堂精品视频| 欧美日韩色一区| 美女视频网站久久| 国产视频不卡一区| 91久久精品一区二区二区| 无吗不卡中文字幕| 欧美白人最猛性xxxxx69交| 高清国产午夜精品久久久久久| 国产精品的网站| 欧美精选一区二区| 国产在线视频一区二区三区| 国产精品电影一区二区三区| 欧美日韩在线播放一区| 久久超碰97人人做人人爱| 中文乱码免费一区二区 | 欧美一级搡bbbb搡bbbb| 国产成人自拍网| 亚洲一区视频在线观看视频| 日韩欧美区一区二|