1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace cv;
using namespace std;
#if 0
Mat contrastLUT(unsigned char thresh) {
Mat ret = Mat(256, 1, CV_8U);
for(int i = 0; i < 255; i++)
ret = (i < thresh) ? 0 : i;
return ret;
}
#endif
// parameters were lifted off the internet
Mat maximalGaborFilter(Mat in, int nfilts = 10,
int ksize = 9,
double sig = 3,
double lm = 8,
double gm = 0.02,
double ps = 0) {
Mat filtered[nfilts];
double dtheta = 2 * M_PI / nfilts;
// Gabor filtering
for(int i = 0; i < nfilts; i++)
{
//double theta = 0;
Mat kern = getGaborKernel(Size(ksize, ksize), sig, i * dtheta, lm, gm, ps, CV_32F);
Mat dest;
filter2D(in, dest, CV_32FC1, kern);
normalize(dest, dest, 0, 1, NORM_MINMAX);
//imshow(string("filt") + to_string(theta), dest);
filtered[i] = dest;
}
Size sz = filtered[0].size();
cout << "Result size: " << sz << endl;
Mat result = Mat(sz, CV_32F, Scalar(0));
for(int y = 0; y < sz.height; y++) {
for(int x = 0; x < sz.width; x++) {
float v = -1;
for(int i = 0; i < nfilts; i++)
v = std::max(v, filtered[i].at<float>(y, x));
//cout << y << ", " << x << endl;
result.at<float>(y, x) = v;
//outrow[x] = v;
}
}
return result;
}
// normalized sum of maximal gabor filtered image with varied kernel
// size
Mat summedGaborFilter(Mat in, int start, int stop, int step) {
assert(!(step & 1) && (start & 1) && (stop & 1));
int n = (stop - start) / step + 2;
double sf = 1. / n;
Mat result = Mat(in.size(), CV_32F, Scalar(0));
for(int i = start; i <= stop; i += step) {
Mat m = maximalGaborFilter(in, 10, i);
result += sf * m;
}
return result;
}
int main()
{
while(1)
{
for(int i = 1; i < 23; i++)
{
char buf[64];
snprintf(buf, sizeof(buf), "SLO Data for registration/SLO001/SLO_subject001_frame%d.png", i);
Mat img;
img = imread(buf);
cvtColor(img, img, COLOR_BGR2GRAY);
resize(img, img, Size(512, 512));
imshow("orig", img);
Mat img_invert = Scalar::all(255) - img;
img_invert.convertTo(img_invert, CV_8UC1, 1, 0);
/*
for(int i = 5; i < 15; i += 2)
{
Mat result = maximalGaborFilter(img_invert, 10, i);
imshow(string("filtered") + to_string(i), result);
}
*/
Mat result = summedGaborFilter(img_invert, 3, 13, 2);
imshow("filtered", result);
waitKey(0);
}
}
}
|