反向投影图

        图像的反向投影图是用输入图像的某一位置上像素值(多维或灰度)对应在直方图的一个bin上的值来代替该像素值,所以得到的反向投影图是单通的。用统计学术语,输出图像象素点的值是观测数组在某个分布(直方图)下的概率。


                                其中 b(xi) 表示在位置 xi 上像素对应的直方图第 b(xi) bin ,直方图共 m bin ,qu表示第ubin的值。
以例子说明如下:
(1)例如灰度图像如下

Image=

  0    1    2    3

  4    5    6    7

  8    9   10   11

  8    9   14   15

(2)该灰度图的直方图为bin指定的区间为[0,3)[4,7)[8,11)[12,16)

Histogram=

  4    4    6    2

(3)反向投影图

Back_Projection=

  4    4    4    4

  4    4    4    4

  6    6    6    6

  6    6    2    2

例如位置(0,0)上的像素值为0,对应的bin[0,3),所以反向直方图在该位置上的值这个bin的值4

测试代码如下:

#include <iostream>
using namespace std;
#include <iomanip>
#include <highgui.h>
#include <cv.h>
 
int main()
{
         uchar data[]={0,1,2,3,4,5,6,7,8,9,10,11,8,9,14,15};     //图像数据
         CvMat mat=cvMat(4,4,CV_8UC1,data);
 
         IplImage g_img;      //灰度图
         cvGetImage(&mat,&g_img);
 
         //打印图像数据
         cout<<"Image="<<endl;
         for(int i=0;i<g_img.height;i++)
         {
                   uchar* ptr=(uchar*)(g_img.imageData+i*g_img.widthStep);
                   for(int j=0;j<g_img.width;j++)
                   {
                            cout<<setw(3)<<setprecision(2)<<(int)ptr[j]<<"  ";
                   }
                   cout<<endl;
         }
 
         //计算图像直方图
         IplImage* imgs[]={&g_img};
         int g_bin=4;
         int size[]={g_bin};
         float g_ranges[]={0,4,8,12,16};
         float* ranges[]={g_ranges};
         CvHistogram* hist=cvCreateHist(1,size,CV_HIST_ARRAY,ranges,0);
         cvCalcHist(imgs,hist);
 
         //打印图像直方图数据
         cout<<"Histogram="<<endl;
         for(int i=0;i<g_bin;i++)
         {
                   cout<<setw(3)<<setprecision(2)<<*cvGetHistValue_1D(hist,i)<<"  ";
         }
         cout<<endl;
 
         //计算反向投影图
         IplImage* back_project=cvCreateImage(cvGetSize(&g_img),g_img.depth,1);
         cvCalcBackProject(imgs,back_project,hist);
 
         //打印反向投影图数据
         cout<<"Back_Projection="<<endl;
         for(int i=0;i<back_project->height;i++)
         {
                   uchar* ptr=(uchar*)(back_project->imageData+i*back_project->widthStep);
                   for(int j=0;j<back_project->width;j++)
                   {
                            cout<<setw(3)<<setprecision(2)<<(int)ptr[j]<<"  ";
                   }
                   cout<<endl;
         }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值