#include "HDR.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include "convex.h"
#include "ImageObject.h"
#include "MTBRegistration.h"
#include "iostream"
#include <ctime>
using namespace std;
#define WHITE_EFFICACY 179.0
typedef unsigned char Trgbe;
list<point>* ghost; //ghost list, maximum ghost regions is set to 20
float weight(unsigned char z)
{
return (z<127)?(z+0.0):(255.0-z);
}
int find_max(int a,int b,int c)
{
int t = a<b?b:a;
t = t<c?c:t;
return t;
}
int find_min(int a,int b,int c)
{
int t = a<b?a:b;
t = t<c?t:c;
return t;
}
HDR::HDR(void)
{
img_set_color = NULL;
//img_set = NULL;
p = 0;
t = NULL;
X = NULL;
log_radiance = NULL;
variance_img = NULL;
tone_map_img = NULL;
color_tone_map = NULL;
width = 0;
height = 0;
}
HDR::HDR(ImageObject image_set[], int num_images, float time[],bool raw)
{
p = num_images;
img_set_color = new ImageObject[p];
//img_set = new ImageObject[p];
t = new float[p];
width = image_set[0].GetWidth();
height = image_set[0].GetHeight();
CvSize size = cvSize(width,height);
for(int i = 0;i<num_images;i++)
{
//ImageObject t(*image_set[i]);
img_set_color[i].CopyOf(image_set[i],raw);
//img_set[i].CopyOf(image_set[i]);
//cvCopy(image_set[i], img_set_color[i]);
/*img_set[i] = new ImageObject(width,height,1);
IplImage* temp = cvCreateImage(size,8,1);
cvCvtColor(image_set[i],temp,CV_BGR2GRAY);
cvCopy(temp,img_set[i]);*/
t[i] = time[i];
}
tone_map_img = cvCreateImage(size,8,1);
variance_img = cvCreateImage(size,8,1);
color_tone_map = cvCreateImage(size,8,3);
threshold = 0.15;
}
void HDR::MTB(bool raw)
{
clock_t t1,t2;
t1 = clock();
cout<<"MTB registration..."<<'\t';
MTBRegistration imageOp;
int imageNum = p;
int *shifted_value = new int[(imageNum-1) * 2];
//for (int i = 0; i < imageNum -1; i++)
//{
// int shift[2];
// imageOp.ImageRegistration(*imageList[i], *imageList[i+1], 4, shift);
// shifted_value[2*i] = shift[0];
// shifted_value[ 2*i + 1] = shift[1];
// cout << shifted_value[2*i] << '\t' << shifted_value[2*i+1] << endl;
//}
//for (int k = 0; k < imageNum; k++)
//{
// if (k == 3)
// {
// //shifted_value[2*i] = 0;
// //shifted_value[2*i+1] = 0;
// continue;
// }
// int adjust_shiftValue[2];
// adjust_shiftValue[0] = adjust_shiftValue[1] = 0;
// if (k < 3)
// {
// for (int i = k; i < 3; i++)
// {
// adjust_shiftValue[0] -= shifted_value[2*i];
// adjust_shiftValue[1] -= shifted_value[2*i + 1];
// }
// imageOp.ImageAlignment(*imageList[k], adjust_shiftValue, folder_path, k);
// }
// if (k > 3)
// {
// adjust_shiftValue[0] = 0;
// adjust_shiftValue[1] = 0;
// for (int i = 4; i <= k; i++)
// {
// adjust_shiftValue[0] += shifted_value[2 * (i-1)];
// adjust_shiftValue[1] += shifted_value[2 * (i-1) + 1];
// }
// imageOp.ImageAlignment(*imageList[k], adjust_shiftValue, folder_path, k);
// }
//}
for (int i = 0; i < imageNum -1; i++)
{
int shift[2];
int base[2] = {0,0};
//if(i == 0)
{
imageOp.ImageRegistration(img_set_color[i], img_set_color[i+1],4, shift,base);
shifted_value[2*i] = shift[0];
shifted_value[ 2*i + 1] = shift[1];
//cout << "shift value: "<<shifted_value[2*i] << '\t' << shifted_value[2*i+1] << endl;
}
//else{
// int j = i - 1;
// base[0] = shifted_value[2*j];
// base[1] = shifted_value[ 2*j + 1];
// imageOp.ImageRegistration(img_set_color[i], img_set_color[i+1], 0, shift,base);
// shifted_value[2*i] = shift[0];
// shifted_value[ 2*i + 1] = shift[1];
// //cout <<"shift value: "<< shifted_value[2*i] << '\t' << shifted_value[2*i+1] << endl;
//}
}
for (int k = 0; k < imageNum; k++)
{
if (k == 0)
continue;
int adjust_shiftValue[2];
adjust_shiftValue[0] = adjust_shiftValue[1] = 0;
//if (k < 3)
//{
for (int i = 0; i < k; i++)
{
adjust_shiftValue[0] += shifted_value[2*i];
adjust_shiftValue[1] += shifted_value[2*i + 1];
}
imageOp.ImageAlignment(img_set_color[k], adjust_shiftValue, k,raw);
}
t2 = clock();
cout<<"complete!\t"<<(double)(t2-t1)/CLOCKS_PER_SEC<<" seconds"<<'\n';
}
void HDR::CRF()
{
cout<<"CRF recovery... "<<'\t';
clock_t t1,t2;
t1 = clock();
//**** CRF calculation ************************************
CvMat* A = cvCreateMat(16*12*p+257,16*12+256,CV_64FC1);
X = cvCreateMat(16*12+256,1,CV_64FC1);
CvMat* b = cvCreateMat(16*12*p+257,1,CV_64FC1);
int sizes_mask[2]={width*height*p+257,width*height+256};
CvSparseMat* mask = cvCreateSparseMat(2,sizes_mask,CV_8UC1);
float lamda = 20.0;
//include the data-fitting equations
int k=0;
int n = width*height;
for(int i=0;i<width*height;i+=1600)
for(int j=0;j<p;j++)
{
unsigned char z = (unsigned char)((img_set_color[j].GetImage())->imageData+i)[0];
float w = weight(z+1);
cvSetReal2D(A,k,z+1,w);
cvSetReal2D(A,k,256+i/1600,-w);
cvSetReal1D(b,k,w*log(t[j]));
k=k+1;
}
//fix the curve by setting its middle value to 0
cvSetReal2D(A,k,129,1);
k=k+1;
//include the smoothness equations
for(int i=0;i<254;i++)
{
cvSetReal2D(A,k,i, lamda*weight(i+1));
cvSetReal2D(A,k,i+1, -2*lamda*weight(i+1));
cvSetReal2D(A,k,i+2, lamda*weight(i+1));
k=k+1;
}
cvSolve(A,b,X,CV_SVD);
t2 = clock();
cout<<"complete!\t"<<(double)(t2-t1)/CLOCKS_PER_SEC<<" seconds"<<'\n';
}
void HDR::HDR_composite()
{
clock_t t1,t2;
t1 = clock();
cout<<"HDR composition..."<<'\t';
//********* compute log_radiance for each pixel **********************
log_radiance = new float[width*height];
variance_map = new float[width*height]; //anti-ghost variance map
ratio_r = new double*[height];
ratio_g = new double*[height];
ratio_b = new double*[height];
//int** rgb_sum = new int*[height];
for(int i=0;i<height;i++)
{
ratio_r[i] = new double[width];
ratio_g[i] = new double[width];
ratio_b[i] = new double[width];
//rgb_sum[i] = new int[width];
}
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
ratio_r[i][j] = ratio_g[i][j] = ratio_b[i][j] = 0;
// rgb_sum[i][j] = 0;
}
for(int s=0;s<width*height;s++)
{
int i = s/width; //row
int j = s%width; //column
float num = 0;
float w_sum = 0;
float gz_square = 0;
float gz_mean = 0;
variance_map[s] = 0;
double r_r = 0;
double r_g = 0;
double r_b = 0;
int sum_color_w = 0;
for(int k = 0;k<p;k++)
{
uchar z = ((img_set_color[k].m_ptImageObject)->imageData+i*(img_set_color[k].m_ptImageObject)->widthStep+j)[0];
//uchar z = (img_set[k].m_ptColorImage->imageData+i*img_set[k].m_ptColorImage->widthStep+j*3)[c];
float w = ((z+0.0)<127)?(z+0.0):(255-(z+0.0));
float gz = cvGetReal1D(X,z);
num+= w*(gz-log(t[k]));
w_sum += w;
gz_mean += w*(gz-log(t[k]));
gz_square += w*(gz-log(t[k]))*(gz-log(t[k]));
/*float gz = log(z+0.0)-log(t[k]);
num += w*gz;
w_sum += w;
gz_mean += w*gz;
gz_square += w*gz*gz;*/
//color computation
int widthStep = (img_set_color[k].GetColorImage())->widthStep;
uchar r = (((img_set_color[k].GetColorImage())->imageData+i*widthStep+j*3)[2]);
uchar g = (((img_set_color[k].GetColorImage())->imageData+i*widthStep+j*3)[1]);
uchar b = (((img_set_color[k].GetColorImage())->imageData+i*widthStep+j*3)[0]);
int s = (r+g+b+0);
if(s==0)
{
r_r = r_g = r_b = 0.0;
}
else
{
r_r = (r+0.0)/(s+0.0);
r_g = (g+0.0)/(s+0.0);
r_b = (b+0.0)/(s+0.0);
}
/*float rf = cvGetReal1D(X,r);
float gf = cvGetReal1D(X,g);
float bf = cvGetReal1D(X,b);*/
int max_rgb = find_max(r,g,b);
int min_rgb = find_min(r,g,b);
int saturation;
//int intensity;
if
评论14
最新资源