Refactoring for the ages

This commit is contained in:
2019-06-23 21:30:08 +02:00
parent 997ea91cb4
commit 8a78f03814
5 changed files with 189 additions and 376 deletions
+27 -54
View File
@@ -20,7 +20,7 @@ public:
//Interpret the bitsets as integers and calculate their distance.
virtual uint64_t distance(uint64_t a, uint64_t b) {
return abs((long long)a - (long long)b);
return abs((int64_t)(a - b));
};
virtual string ToString() = 0;
virtual fs::path ToPath() {
@@ -37,8 +37,6 @@ public:
virtual void preview(Image* img) {
cout << "No preview defined. :-( " << endl;
}
//Helper functions
};
//Average color of the image.
@@ -52,7 +50,7 @@ public:
ssize_t m = img->rows();
Pixels view(*img);
const Quantum *p = view.getConst(0, 0, n, m); //entire image
unsigned long long red = 0, green = 0, blue = 0;
uint64_t red = 0, green = 0, blue = 0;
float numpixels = (float)(n*m);
if (img->channels() < 3) return 0;
for (ssize_t j = 0; j < m; j++) {
@@ -152,19 +150,14 @@ public:
return retval;
}
//biterror
unsigned long long distance(uint64_t a, uint64_t b) {
int biterror = 0;
for (int i = 0; i < 64; i++) {
if (a[i] != b[i]) biterror++;
}
return biterror;
uint64_t distance(uint64_t a, uint64_t b) {
return (uint64_t)__builtin_popcountll(a^b);
}
string ToString() {
return "median";
}
};
/*
//Sobel descriptor
//Calculates average intensity of the image with
//sobel convolution applied in both directions
@@ -185,7 +178,7 @@ public:
Pixels view(*local_image);
const Quantum *p = view.getConst(0, 0, m, n); //entire image
unsigned long long intensity = 0;
uint64_t intensity = 0;
int chan = (int)local_image->channels();
for (ssize_t j = 0; j < m; j++) {
for (ssize_t i = 0; i < n; i++) {
@@ -196,9 +189,9 @@ public:
}
//cout << endl;
}
int scaledIntensity = ((float)(intensity / (n*m)) / QuantumRange) * 255;
uint64_t scaledIntensity = ((float)(intensity / (n*m)) / QuantumRange) * 255;
delete local_image;
return uint64_t(scaledIntensity);
return scaledIntensity;
}
string ToString() {
return "sobel";
@@ -223,29 +216,25 @@ public:
Pixels view(*local_image);
int chan = (int)local_image->channels();
const Quantum *p = view.getConst(0, 0, n, m); //entire image
uint64_t retval(0);
uint64_t retval = 0;
int prev = p[0]; //so we always start with a 0
for (ssize_t j = 0; j < m; j++) {
for (ssize_t i = 0; i < n; i++) {
//LTR scanning
//NOTE: Scanning order might be quite relevant for this descriptor
int cur = p[0];
if(prev < cur) retval |= uint64_t(1); //XOR
prev = cur;
if(prev < cur) retval++;
retval <<= 1;
p = p + chan;
retval <<= 1;
prev = cur;
}
}
delete local_image;
return retval;
}
unsigned long long distance(uint64_t a, uint64_t b) {
int biterror = 0;
for (int i = 0; i < 64; i++) {
if (a[i] != b[i]) biterror++;
}
return biterror;
uint64_t distance(uint64_t a, uint64_t b) {
return (uint64_t)__builtin_popcountll(a^b);
}
string ToString() {
return "pearson";
@@ -267,11 +256,10 @@ public:
Pixels view(*local_image);
int chan = (int)local_image->channels();
const Quantum *p = view.getConst(0, 0, n, m); //entire image
uint64_t retval(0);
uint64_t retval = 0;
for (ssize_t j = 0; j < m; j++) {
for (ssize_t i = 0; i < n; i++) {
if(p[0] != 0)
retval |= uint64_t(1); //XOR
if(p[0] != 0) retval++;
retval <<= 1;
p = p + chan;
@@ -280,12 +268,8 @@ public:
delete local_image;
return retval;
}
unsigned long long distance(uint64_t a, uint64_t b) {
int biterror = 0;
for (int i = 0; i < 64; i++) {
if (a[i] != b[i]) biterror++;
}
return biterror;
uint64_t distance(uint64_t a, uint64_t b) {
return (uint64_t)__builtin_popcountll(a^b);
}
string ToString() {
return "threshold";
@@ -343,23 +327,17 @@ public:
double* converted = CalculateDCT(local_image);
double prev = 0;
uint64_t retval(0);
uint64_t retval = 0;
for (int i = 0; i < 64; i++) {
if (converted[i] > prev) {
retval |= uint64_t(1); //XOR
}
if (converted[i] > prev) retval++;
retval <<= 1;
prev = converted[i];
}
delete local_image;
return retval;
}
unsigned long long distance(uint64_t a, uint64_t b) {
int biterror = 0;
for (int i = 0; i < 64; i++) {
if (a[i] != b[i]) biterror++;
}
return biterror;
uint64_t distance(uint64_t a, uint64_t b) {
return (uint64_t)__builtin_popcountll(a^b);
}
string ToString() {
return "DCTPearson";
@@ -393,23 +371,18 @@ public:
sort(bullshit, bullshit + 64);
float median = (float)(bullshit[31] + bullshit[32]) / 2;
uint64_t retval(0);
uint64_t retval = 0;
for (ssize_t i = 0; i < 64; i++) {
retval <<= 1;
if (converted[i] > median)
retval |= uint64_t(1);
if (converted[i] > median) retval++;
}
delete local_image;
return retval;
}
unsigned long long distance(uint64_t a, uint64_t b) {
int biterror = 0;
for (int i = 0; i < 64; i++) {
if (a[i] != b[i]) biterror++;
}
return biterror;
uint64_t distance(uint64_t a, uint64_t b) {
return (uint64_t)__builtin_popcountll(a^b);
}
string ToString() {
return "DCTMedian";
}
};*/
};