lbp-关于关于这个代码中终点计算的问题

问题描述

关于关于这个代码中终点计算的问题

请问师兄,下面的那个uniform完整代码中终点为什么要这么计算?
还有基于uniform的旋转不变性LBP值,在u>2时是p+1?

解决方案

为什么看不到你有粘代码?代码贴出来吧~这样不知道你的问题在哪里

解决方案二:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#define PI 3.1415926
#define MAX(x,y) (x)>(y)?(x):(y)
#define MIN(x,y) (x)<(y)?(x):(y)

typedef struct MyPoint
{
double x;
double y;
}MyPoint;
void calc_position(int radius,int num_sp,MyPoint *spoint)
{
double theta;

theta = 2*PI/num_sp;

for (int i = 0; i < num_sp; i++)
{
    spoint[i].y = -radius * sin(i * theta);
    spoint[i].x = radius * cos(i * theta);
}

}
int calc_sum(int r)
{
int res_sum;

res_sum = 0;
while (r)
{
    res_sum = res_sum + r % 2;
    r /= 2;
}
return res_sum;

}
void rotation_uniform_invariant_mapping(int range,int num_sp,int *Mapping)
{
int numt,i,j,tem_xor;

numt = 0;
tem_xor = 0;
for (i = 0; i< range; i++)
{
    j = i << 1;
    if (j > range -1)
    {
        j = j - (range -1);
    }

    tem_xor = i ^ j;    // 异或
    numt = calc_sum(tem_xor);//计算异或结果中1的个数,即跳变个数

    if (numt <= 2)
    {
        Mapping[i] = calc_sum(i);
    }else{
        Mapping[i] = num_sp+1;
    }
}

}

void rotation_uniform_invariant_lbp(IplImage *src,int height,int width,int num_sp,MyPoint *spoint,int *Mapping)
{
IplImage *target,*hist;
int i,j,k,box_x,box_y,orign_x,orign_y,dx,dy,tx,ty,fy,fx,cy,cx,v;
double min_x,max_x,min_y,max_y,w1,w2,w3,w4,N,x,y;
int *result;
float dishu;

dishu = 2.0;
max_x=0;max_y=0;min_x=0;min_y=0;
for (k=0;k<num_sp;k++)
{
    if (max_x<spoint[k].x)
    {
        max_x=spoint[k].x;
    }
    if (max_y<spoint[k].y)
    {
        max_y=spoint[k].y;
    }
    if (min_x>spoint[k].x)
    {
        min_x=spoint[k].x;
    }
    if (min_y>spoint[k].y)
    {
        min_y=spoint[k].y;
    }
}

//计算模版大小
box_x = ceil(MAX(max_x,0)) - floor(MIN(min_x,0)) + 1;
box_y = ceil(MAX(max_y,0)) - floor(MIN(min_y,0)) + 1;

if (width<box_x||height<box_y)
{
    printf("Too small input image. Should be at least (2*radius+1) x (2*radius+1)");
    return;
}

//计算可滤波图像大小,opencv图像数组下标从0开始
orign_x = 0 - floor(MIN(min_x,0));//起点
orign_y = 0 - floor(MIN(min_x,0));

dx = width - box_x+1;//终点
dy = height - box_y+1;

target = cvCreateImage(cvSize(dx,dy),IPL_DEPTH_8U,1);
result = (int *)malloc(sizeof(int)*dx*dy);

memset(result,0,sizeof(int)*dx*dy);
CvRect roi =cvRect(orign_x, orign_y, dx, dy);
cvSetImageROI(src, roi);
cvCopy(src, target);
cvResetImageROI(src);
cvSaveImage("haha.jpg",target);

for ( k = 0; k<num_sp;k++)
{
    x = spoint[k].x+orign_x;
    y = spoint[k].y+orign_y;

    //二线性插值图像
    fy = floor(y);  //向下取整
    fx = floor(x);
    cy = ceil(y);   //向上取整
    cx = ceil(x);
    ty = y - fy;
    tx = x - fx;
    w1 = (1 - tx) * (1 - ty);
    w2 = tx  * (1 - ty);
    w3 = (1 - tx) * ty ;
    w4 = tx * ty ;
    v = pow(dishu,(float)k);

    for (i = 0;i<dy;i++)
    {
        for (j = 0;j<dx;j++)
        {
            //灰度插值图像像素
            N = w1 * (double)(unsigned char)src->imageData[(i+fy)*src->width+j+fx]+
                w2 * (double)(unsigned char)src->imageData[(i+fy)*src->width+j+cx]+
                w3 * (double)(unsigned char)src->imageData[(i+cy)*src->width+j+fx]+
                w4 * (double)(unsigned char)src->imageData[(i+cy)*src->width+j+cx];

            if( N >= (double)(unsigned char)target->imageData[i*dx+j])
            {
                result[i*dx+j] = result[i*dx+j] + v * 1;
            }else{
                result[i*dx+j] = result[i*dx+j] + v * 0;
            }
        }
    }
}

//将result的值映射为mapping的值
for(i = 0; i < dy ;i++)
{
    for (j = 0; j < dx ;j ++)
    {
        result[i*dx+j] = Mapping[result[i*dx+j]];
    }
}

//显示图像
int cols = 0;//直方图的横坐标,也是result数组的元素种类
int mapping_size = pow(dishu,(float)num_sp);
for (i = 0;i < mapping_size; i++ )
{
    if (cols < Mapping[i])
    {
        cols = Mapping[i];
    }
}

if (cols < 255)
{
    //只有采样数小于8,则编码范围0-255,才能显示图像
    for (i = 0;i<dy;i++)
    {
        for (j = 0;j<dx;j++)
        {
            target->imageData[i*dx+j] = (unsigned char)result[i*dx+j];
            //printf("%dn",(unsigned char)target->imageData[i*width+j]);
        }
    }
    cvSaveImage("result.jpg",target);
}

//计算直方图
hist = cvCreateImage(cvSize(300,200),IPL_DEPTH_8U,3);//直方图图像
double *val_hist = (double *)malloc(sizeof(double)*cols);   //直方图数组
for (i=0;i<cols;i++)
{
    val_hist[i]=0.0;
}
for (i=0; i<dy*dx;i++)
{
    val_hist[result[i]]++;
}

double temp_max=0.0;

for (i=0;i<cols;i++)            //求直方图最大值,为了归一化
{
    //printf("%fn",val_hist[i]);
    if (temp_max<val_hist[i])
    {
        temp_max=val_hist[i];
    }
}
//画直方图
CvPoint p1,p2;
double bin_width=(double)hist->width/cols;
double bin_unith=(double)hist->height/temp_max;

for (i=0;i<cols;i++)
{
    p1.x=i*bin_width;p1.y=hist->height;
    p2.x=(i+1)*bin_width;p2.y=hist->height-val_hist[i]*bin_unith;
    cvRectangle(hist,p1,p2,cvScalar(0,255),-1,8,0);
}
cvSaveImage("hist.jpg",hist);

}

int _tmain(int argc, _TCHAR* argv[])
{
IplImage *src,*grey,*result;
int samples,radius,range,*mapping;
MyPoint *spoint;
float Mi;

samples = 8;
radius = 10;
Mi = 2.0;
range = pow(Mi,samples);

src = cvLoadImage("test2.jpg");
grey = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);
cvCvtColor(src,grey,CV_BGR2GRAY);
mapping = (int *)malloc(sizeof(int)*range);
memset(mapping,0,sizeof(int)*range);

//计算采样点相对坐标
spoint = (MyPoint *)malloc(sizeof(MyPoint)*samples);
calc_position(radius,samples,spoint);

//计算灰度不变性LBP特征,写回浮点数图像矩阵中
//gray_invariant_lbp(grey,src->height,src->width,samples,spoint);

//计算旋转不变形LBP特征
//rotation_invariant_mapping(range,samples,mapping);
//rotation_invariant_lbp(grey,src->height,src->width,samples,spoint,mapping);

//计算旋转不变等价LBP特征
rotation_uniform_invariant_mapping(range,samples,mapping);
rotation_uniform_invariant_lbp(grey,src->height,src->width,samples,spoint,mapping);
return 0;

}

时间: 2024-09-22 06:52:03

lbp-关于关于这个代码中终点计算的问题的相关文章

c#-差分GPS代码中的伪距改正数的计算

问题描述 差分GPS代码中的伪距改正数的计算 我最近在做关于u-blox板子的差分GPS的代码编写,在计算伪距改正数的时候遇到了问题,我计算出来的伪距改正数偏大.我想问问,有没有人写过着方面的代码,能不能给我个参考,最好是在c#下写的.非常感谢....

asp.net放贷计算代码-请教asp.net中放贷计算代码

问题描述 请教asp.net中放贷计算代码 asp.net放贷计算代码asp.net放贷计算代码asp.net放贷计算代码asp.net放贷计算代码 解决方案 google下就有.房贷写错了,这影响你搜索结果的相关性 随便找一个http://download.csdn.net/download/cxd19880708/4039426 别的你也可以自己找.总之,学会自己google.

代码段使用数据-汇编:在代码中使用数据,见代码

问题描述 汇编:在代码中使用数据,见代码 编程计算以下8个数据的和,结果存放在ax寄存器中0123h 0456h 0789h 0abch 0defh 0fedh 0cbah 0987h结果为: 4BDBP123 <汇编语言(第2版)>王爽 8个数据定义在代码段cs,我的想法是将cs赋值给ds,然后使用bx做偏移地址""add ax ds:[bx]"",但是书上是直接使用""add ax cs:[bx]"",运行之后

js html-在线等,急(大神帮帮忙):js动态嵌入html代码,代码中调用函数,当传参为字符串时,函数没有响应

问题描述 在线等,急(大神帮帮忙):js动态嵌入html代码,代码中调用函数,当传参为字符串时,函数没有响应 <!DOCTYPE html> <br> function insert()<br> {<br> var a="jioho";<br> var str="<table><tr><button type='button' onclick='test("+ a+"

使用 Windows XP 的两种强大的工具在您的代码中检测并堵塞 GDI 泄漏

在以前的一篇文章中,作者设计了一种简单的方法来检测图形设备接口 (GDI) 对象,这些对象并未由 Windows 9x 平台上基于 Win32 的应用程序正确地进行发布.因为有些更新版本的 Windows 需要一种不太相同的 GDI 泄漏方法,作者已经更新了针对那些操作系统的方法.他构建并说明了两种工具,这两种工具旨在检测并消除在 Windows XP.Windows 2000 和 Windows NT 上运行的应用程序中的 GDI 泄漏. 在 Windows 95.Windows 98 和 W

c#-C#简单问题,C# if语句的代码也进行计算吗?

问题描述 C#简单问题,C# if语句的代码也进行计算吗? 为什么下面代码的运行结果是a=4 b=1 a=4 b=1 条件语句也进行运算吗? using System; using System.Collections.Generic; using System.Text; namespace 例3_04 { class Program { static void Main(string[] args) { int a = 3, b = 2; if (a > b && a++ >

将业务规则从代码中解脱出来:用技术打造的营销利器——规则引擎

规则引擎是一款用于解决业务规则频繁变化的在线服务,它能帮助客户将业务规则从应用程序代码中分离出来,通过简单组合预定义的条件因子即可灵活编写业务规则,并根据业务规则做出业务决策. 规则引擎原理 规则引擎提供一整套的高效.易用的API服务,并配套了简单易用的规则配置界面,能够被业务系统快速集成. 对比现有的其他产品,它拥有以下优势: 1.灵活制定规则:业务规则与应用系统剥离,并且通过条件因子可以自由组合规则. 2.场景定制:移动终端定制,支持手机APP集成SDK自动采集数据.配套规则配置界面. 3.

java-优化-代码中的优化(1)

1.尽量使用final修饰符. 带有final修饰符的类是不可派生的.在JAVA核心API中,有许多应用final的例子,例如java.lang.String.为String类指定final防止了使用者覆盖length()方法.另外,如果一个类是final的,则该类所有方法都是final的.java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关).此举能够使性能平均提高50%. 2.尽量重用对象. 特别是String对象的使用中,出现字符串连接情况时应使用St

计算方差-请教大神在opencv中怎么计算图像局部方差

问题描述 请教大神在opencv中怎么计算图像局部方差 请教大神在opencv中怎么计算图像局部方差, 请教大神在opencv中怎么计算图像局部方差, 请教大神在opencv中怎么计算图像局部方差,谢谢 解决方案 你也在学opencv吗,可以交流下 解决方案二: 局部,是正常的矩形还是不规则区域 矩形: 坐标的x y即像素点的x y根据长宽遍历 不规则: 我暂时没有计算过 你图像是灰阶还是RGB 如果灰阶 按照灰阶度使用公式即可,如果是RGB建议先用cvmerxx 函数忘记了 把RGB通道合成之