aboutsummaryrefslogtreecommitdiff
path: root/gabor.cpp
blob: f4659121debb2b520b64d322cbb36026396382df (plain)
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);
        }
    }
}