-
Notifications
You must be signed in to change notification settings - Fork 2
/
processing.cpp
96 lines (82 loc) · 3.05 KB
/
processing.cpp
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
#include "processing.h"
#include "QDebug"
#define hist first
#define minValue second
ProcessImg::ProcessImg()
{
}
/*
* function to implement median filter
* params : CV::Mat object image
* first it selects the neighbouring 8 pixels for each pixel in the picture, then sort them and inject the median in the current pix
*/
void ProcessImg::normalize(Mat& img, int minVal, int maxVal)
{
int oldMin = 99999, oldMax = 0;
for (int rowCounter = 0; rowCounter < img.rows; rowCounter++)
for (int colCounter = 0; colCounter < img.cols; colCounter++)
{
const unsigned char& pixelVal = img.at<unsigned char>(rowCounter,colCounter);
if(pixelVal>oldMax) oldMax = pixelVal;
if(pixelVal<oldMin) oldMin = pixelVal;
}
if(minVal==oldMin && maxVal==oldMax) return ;
for (int rowCounter = 0; rowCounter < img.rows; rowCounter++)
for (int colCounter = 0; colCounter < img.cols; colCounter++)
{
unsigned char& pixelVal = img.at<unsigned char>(rowCounter,colCounter);
pixelVal = ((pixelVal-oldMin) * (maxVal-minVal) / (oldMax-oldMin)) + minVal;
}
}
/*
* function to implement median filter
* params : CV::Mat object image
* first it selects the neighbouring 8 pixels for each pixel in the picture, then sort them and inject the median in the current pix
*/
void ProcessImg::histEqualize(Mat& img)
{
int n_bins = 256;
QPair<vector<int>, int> data = calcHist(img); // getting histogram array and the minima in pair
vector<int> hist = data.hist;
int minVal = data.minValue;
float scale = (n_bins - 1.f) / (img.rows*img.cols - hist[minVal]);
vector<int> lut(n_bins, 0);
int i = minVal+1;
int sum = 0;
for (; i < hist.size(); ++i) {
sum += hist[i];
// the value is saturated in range [0, max_val]
lut[i] = max(0, min(int(round(sum * scale)), 255));
}
for (int rowCounter = 0; rowCounter < img.rows; rowCounter++)
for (int colCounter = 0; colCounter < img.cols; colCounter++)
{
unsigned char& pixelVal = img.at<unsigned char>(rowCounter,colCounter);
pixelVal = lut[pixelVal];
}
}
/*
* function to implement median filter
* params : CV::Mat object image
* first it selects the neighbouring 8 pixels for each pixel in the picture, then sort them and inject the median in the current pix
*/
QPair<vector<int>, int> ProcessImg::calcHist(Mat& img, int maxVal)
{
int n_bins = maxVal + 1;
int minVal = maxVal;
// Compute histogram
vector<int> hist(n_bins, 0);
for (int rowCounter = 0; rowCounter < img.rows; rowCounter++)
for (int colCounter = 0; colCounter < img.cols; colCounter++)
{
const unsigned char& pixelVal = img.at<unsigned char>(rowCounter,colCounter);
// getting the lowest pixel value index as it will be the first non zero value so we can know the CDF min after
// finishing scanning the image
if (pixelVal < minVal) minVal = pixelVal;
hist[pixelVal] += 1;
}
QPair<vector<int>, int> data;
data.hist = hist;
data.minValue = minVal;
return data;
}