Skip to content

Commit 61149f8

Browse files
committed
removing highlights and shadows (hopefully)
1 parent c5b5fad commit 61149f8

File tree

2 files changed

+78
-18
lines changed

2 files changed

+78
-18
lines changed

relightlab/normalstask.cpp

+77-18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "normalstask.h"
1+
#include "normalstask.h"
22
#include "../src/jpeg_decoder.h"
33
#include "../src/jpeg_encoder.h"
44
#include "../src/imageset.h"
@@ -139,19 +139,19 @@ void NormalsTask::run() {
139139
if(parameters.flatMethod != FLAT_NONE) {
140140

141141
switch(parameters.flatMethod) {
142-
case FLAT_NONE: break;
143-
case FLAT_RADIAL:
144-
flattenRadialNormals(width, height, normals, 100);
145-
break;
146-
case FLAT_FOURIER:
147-
//convert radius to frequencies
148-
double sigma = width*parameters.flatPercentage/100;
149-
try {
150-
flattenFourierNormals(width, height, normals, 0.2, sigma);
151-
} catch(std::length_error e) {
152-
return;
153-
}
154-
break;
142+
case FLAT_NONE: break;
143+
case FLAT_RADIAL:
144+
flattenRadialNormals(width, height, normals, 100);
145+
break;
146+
case FLAT_FOURIER:
147+
//convert radius to frequencies
148+
double sigma = width*parameters.flatPercentage/100;
149+
try {
150+
flattenFourierNormals(width, height, normals, 0.2, sigma);
151+
} catch(std::length_error e) {
152+
return;
153+
}
154+
break;
155155
}
156156
}
157157

@@ -163,15 +163,15 @@ void NormalsTask::run() {
163163
normalmap[i] = floor(((normals[i] + 1.0f) / 2.0f) * 255);
164164

165165
QImage img(normalmap.data(), width, height, width*3, QImage::Format_RGB888);
166-
166+
167167

168168
// Set spatial resolution if known. Need to convert as pixelSize stored in mm/pixel whereas QImage requires pixels/m
169169
if( pixelSize > 0 ) {
170170
int dotsPerMeter = round(1000.0/pixelSize);
171171
img.setDotsPerMeterX(dotsPerMeter);
172172
img.setDotsPerMeterY(dotsPerMeter);
173173
}
174-
img.save(parameters.path);
174+
img.save(parameters.path, nullptr, 98);
175175
}
176176

177177

@@ -283,7 +283,7 @@ bool savePly(const char *filename, pmp::SurfaceMesh &mesh) {
283283
bool saveObj(const char *filename, pmp::SurfaceMesh &mesh) {
284284
FILE *fp = fopen(filename, "wb");
285285
if(!fp) {
286-
// cerr << "Could not open file: " << filename << endl;
286+
// cerr << "Could not open file: " << filename << endl;
287287
return false;
288288
}
289289
int nvertices = 0;
@@ -341,7 +341,8 @@ void NormalsWorker::run() {
341341
switch (solver)
342342
{
343343
case NORMALS_L2:
344-
solveL2();
344+
//solveL2();
345+
solveL2Histogram();
345346
break;
346347
case NORMALS_SBL:
347348
solveSBL();
@@ -399,6 +400,64 @@ void NormalsWorker::solveL2()
399400
normalIdx += 3;
400401
}
401402
}
403+
404+
void NormalsWorker::solveL2Histogram(){
405+
//filter lights by elevation keep between 30 and 60.
406+
vector<Vector3f> &m_Lights = m_Imageset.lights();
407+
408+
Eigen::MatrixXd mLights(m_Lights.size(), 3);
409+
Eigen::MatrixXd mPixel(m_Lights.size(), 1);
410+
411+
unsigned int normalIdx = 0;
412+
413+
for (size_t p = 0; p < m_Row.size(); p++) {
414+
std::vector<std::pair<float, Vector3f>> entries(m_Lights.size());
415+
416+
for(size_t i = 0; i < m_Lights.size(); i++) {
417+
float c = m_Row[p][i].mean();
418+
entries[i] = make_pair(c, m_Lights[i]);
419+
}
420+
sort(entries.begin(), entries.end(), [](const auto& a, const auto& b) {
421+
return a.first < b.first;
422+
});
423+
int start = entries.size()/8;
424+
int end = entries.size()*7/8;
425+
for(int i = 0; i < start - end; i++)
426+
entries[i] = entries[i + start];
427+
entries.resize(end - start);
428+
429+
mLights.resize(entries.size(), 3);
430+
mPixel.resize(entries.size(), 1);
431+
432+
for(size_t i = 0; i < entries.size(); i++) {
433+
auto &entry = entries[i];
434+
435+
Vector3f light;
436+
if(m_Imageset.light3d) {
437+
light = m_Imageset.relativeLight(entry.second, p, m_Imageset.height - row);
438+
light.normalize();
439+
} else
440+
light = entry.second;
441+
442+
for (int j = 0; j < 3; j++)
443+
mLights(i, j) = light[j];
444+
445+
mPixel(i, 0) = entry.first;
446+
}
447+
448+
Eigen::MatrixXd mNormals = (mLights.transpose() * mLights).ldlt().solve(mLights.transpose() * mPixel);
449+
mNormals.col(0).normalize();
450+
assert(!isnan(mNormals.col(0)[0]));
451+
assert(!isnan(mNormals.col(0)[1]));
452+
assert(!isnan(mNormals.col(0)[2]));
453+
m_Normals[normalIdx+0] = float(mNormals.col(0)[0]);
454+
m_Normals[normalIdx+1] = float(mNormals.col(0)[1]);
455+
m_Normals[normalIdx+2] = float(mNormals.col(0)[2]);
456+
457+
normalIdx += 3;
458+
}
459+
}
460+
402461
void NormalsWorker::solveSBL()
403462
{
404463
}

relightlab/normalstask.h

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class NormalsWorker
6767
void run();
6868
private:
6969
void solveL2();
70+
void solveL2Histogram();
7071
void solveSBL();
7172
void solveRPCA();
7273
private:

0 commit comments

Comments
 (0)