-
Notifications
You must be signed in to change notification settings - Fork 0
/
tiltshift.cpp
152 lines (122 loc) · 3.34 KB
/
tiltshift.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <iostream>
#include <opencv2/opencv.hpp>
#include <cmath>
using namespace cv;
using namespace std;
double ARC;
double FD;
double PVC;
double alpha;
int sldrARC;
int sldrARCmax;
int sldrFD;
int sldrFDmax;
int sldrPVC;
int sldrPVCmax;
Mat img, borrada, tilt;
char TrackbarName[50];
//Função para borrar a ibagen
void borrar(){
//Criação da mascara de borramento
float gauss[] = {1,2,1,
2,4,2,
1,2,1};
Mat mask(3,3,CV_32F);
mask = Mat(3, 3, CV_32F, gauss);
scaleAdd(mask, 1/16.0, Mat::zeros(3,3,CV_32F), mask);
img.convertTo(borrada, CV_32F);
filter2D(borrada, borrada, borrada.depth(), mask, Point(1,1), 0);
filter2D(borrada, borrada, borrada.depth(), mask, Point(1,1), 0);
filter2D(borrada, borrada, borrada.depth(), mask, Point(1,1), 0);
filter2D(borrada, borrada, borrada.depth(), mask, Point(1,1), 0);
filter2D(borrada, borrada, borrada.depth(), mask, Point(1,1), 0);
filter2D(borrada, borrada, borrada.depth(), mask, Point(1,1), 0);
filter2D(borrada, borrada, borrada.depth(), mask, Point(1,1), 0);
borrada.convertTo(borrada, CV_8U);
}
void saida()
{
double x_;
for(int i = 0; i < img.rows; i++){
//valor de X deslocado
x_ = i - (PVC + ARC/2.0);
//calculo do alpha
alpha = 0.5 * (tanh((x_ + ARC/2)/FD) - tanh((x_ - ARC/2)/FD));
for(int j = 0; j < img.cols; j++){
//combinação das ibagens para imagem de saida
tilt.at<Vec3b>(i, j) = alpha * img.at<Vec3b>(i, j) + (1-alpha)*borrada.at<Vec3b>(i, j);
}
}
}
//aumentar saturação da imagem
void aumentarSat(){
Mat imghsv, hsv[3];
cvtColor(tilt, imghsv, COLOR_BGR2HSV);
split(imghsv, hsv);
hsv[1] = hsv[1] * 1.8;
merge(hsv, 3, imghsv);
cvtColor(imghsv, tilt, COLOR_HSV2BGR);
}
//Alterar o slider da Posição Vertical do Centro
void alterarSldrPVC(int, void*){
PVC = sldrPVC;
saida();
aumentarSat();
imshow("Tiltshift", tilt);
}
//Alterar slider da Altura da Região central
void alterarSldrARC(int, void*){
ARC = sldrARC;
saida();
aumentarSat();
imshow("Tiltshift", tilt);
}
//Slider para alterar a Força de Decaimento
void alterarSldrFD(int, void*){
FD = sldrFD;
//Para evitar divião por 0 forçamos o minimo igual a 1
if(FD == 0){
FD = 1;
}
saida();
aumentarSat();
imshow("Tiltshift", tilt);
}
int main(int argc, char* argv[]){
//Leitura da imagem
img = imread(argv[1], CV_LOAD_IMAGE_COLOR);
if (!img.data){
cout << "Imagem não foi aberta" << endl;
return -2;
}
tilt = img.clone();
//criação da janela e redimensionamento dela
namedWindow("Tiltshift", WINDOW_NORMAL);
resizeWindow("Tiltshift", 600,600);
//Criar imagem borrada
borrar();
//inicializar os valores dos sliders
sldrARC = 1;
sldrFD = 1;
sldrPVC = 1;
//Definir o maximo de cada slider
sldrARCmax = tilt.rows;
sldrPVCmax = tilt.rows;
sldrFDmax = 100;
//Criação dos sliders
createTrackbar("Altura", "Tiltshift", &sldrARC, sldrARCmax, alterarSldrARC);
alterarSldrARC(sldrARC, 0);
createTrackbar("Decaimento", "Tiltshift", &sldrFD, sldrFDmax, alterarSldrFD );
alterarSldrFD(sldrFD, 0);
createTrackbar( "Centro", "Tiltshift", &sldrPVC, sldrPVCmax, alterarSldrPVC );
alterarSldrPVC(sldrPVC, 0);
//esperar a tecla esc para finalizar o programa
while(1){
if(waitKey(30) >= 0){
break;
}
}
//Imprimir imagem final
imwrite("tiltshift.png", tilt);
return 0;
}