Refactoring for the ages
This commit is contained in:
+27
-54
@@ -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";
|
||||
}
|
||||
};*/
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user