• 大小: 6KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: C/C++
  • 标签: Gabor  filter  

资源简介

Gabor滤波器C++程序,因自己需要用,所以就写了个。 在此给出了.cpp文件,而.h文件只需要根据程序名称自动生成即可 希望大家能用的着:)

资源截图

代码片段和文件信息

#include “StdAfx.h“
#include “Gabor.h“
#include 
#include 

CGabor::CGabor(void)
{
}

CGabor::~CGabor(void)
{
}

#define SIZE_L 32
#define SIZE_W 16
#define SIZE_L2 16
#define SIZE_W2 8

#ifndef PI
#define PI 3.1415926535897932384626433832795
#endif

/*
 Function Name : Frequency
 Functionality : Prepare frequency For Gabor Filter
  
*/
int CGabor::Frequency(unsigned char * ucImg double * fDirection double * fFrequency long lWidth long lHeight)
{
// the peak point of the sin wave
int peak_pos[SIZE_L];
int peak_cnt;
double peak_freq;
double Xsig[SIZE_L];
// double pmin = 0 pmax = 0;

// directions
    double dir = 0.0;
    double cosdir = 0.0;
    double sindir = 0.0;
double maxPeak minPeak;

double *frequency1 = new double[lWidth*lHeight];

memset(fFrequency 0 sizeof(double)*lWidth*lHeight);
memset(frequency1 0 sizeof(double)*lWidth*lHeight);

long xy;
long dk;
long uv;

for(y=SIZE_L2; y {
for(x=SIZE_L2; x {
dir = fDirection[(y+SIZE_W2)*lWidth + (x+SIZE_W2)];
cosdir = -sin(dir);
sindir = cos(dir);

// calc the x-signature X[0]...X[L-1]
for(k=0; k {
Xsig[k] = 0.0;
for(d=0; d {
u = (long)(x + (d-SIZE_W2)*cosdir + (k-SIZE_L2)*sindir);
v = (long)(y + (d-SIZE_W2)*sindir - (k-SIZE_L2)*cosdir);
// never over the edge
if(u<0)
u =0;
else if(u>lWidth-1)
u = lWidth-1;
if(v<0)
v = 0;
else if(v>lHeight-1)
v = lHeight-1;

Xsig[k] += ucImg[u+v*lWidth];
}
Xsig[k] /= SIZE_W;
}

// here we have got the SIN wave

// see if the wave exists max and min value should have a range
maxPeak = minPeak = Xsig[0];
for(k=0; k {
if(minPeak>Xsig[k])
minPeak = Xsig[k];
if(maxPeak maxPeak = Xsig[k];
}

peak_cnt = 0;
if((maxPeak - minPeak)>64)
{
for(k=0; k {
if((Xsig[k-1] < Xsig[k]) && (Xsig[k] >= Xsig[k+1]))
peak_pos[peak_cnt++] = k;
}
}

// mean peak
peak_freq = 0.0;
if(peak_cnt>=2)
{
for(k=0; k {
peak_freq += (peak_pos[k+1] - peak_pos[k]);
}
peak_freq /= peak_cnt-1;
}
// peak frequency should be limited
if(peak_freq<3.0 || peak_freq>25.0)
frequency1[x+y*lWidth] = 0.0;
else
frequency1[x+y*lWidth] = 1.0/peak_freq;
}
}

// mean filter for the frequency
for(y=SIZE_L2; y {
for(x=SIZE_L2; x {
k = x+y*lWidth;
peak_freq = 0.0;
for(v=-2; v<=2; v++)
{
for(u=-2; u<=2; u++)
{
peak_freq += frequency1[(x+u)+(y+v)*lWidth];
}
}
fFrequency[k] = peak_freq/25;
}
}

delete frequency1;

return 0;
}

/*
 Function Name : ImageEnhance
 Functionality : image enc

评论

共有 条评论