Introdução
Em desenvolvimento…
Desenvolvimento da atividade
Em desenvolvimento…
Código no OpenCV
Em desenvolvimento…
Listagem 1. tiltshift.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <cmath>
using namespace cv;
using namespace std;
//Variáveis da interface
int d_slider = 6; //valor inicial do borramento
float d_slider_max = 100; //valor final do borramento
int position_slider = 50; //valor inicial da posição. Por default, centralizado.
float position_slider_max = 100; //valor final da posição
int height_slider = 50; //valor inicial da altura da imagem nítida
float height_slider_max = 100; //valor final da altura da imagem nítida - Tem q ser float
//Variáveis da função
int l1, l2; //Localização da borda superior e inferior da transição nitido-borrado
float d, centro, altura;
unsigned char R,G,B;
Mat image; //Imagem original
Mat image32F; //Imagem original em ponto flutuante
Mat result; //Imagem borrada
//Mat borrada; //Imagem borrada em ponto flutuante
//Mat degrade; //Imagem com o comportamento da função a ser aplicada na imagem original
//Mat degrade_negativo; //Imagem com o comportamento da função a ser aplicada na imagem borrada
Mat resultado; //Resultado da aplicação do degrade sobre a imagem original
Mat resultado2; //Resultado da aplicação do degrade negativo sobre a imagem borrada
Mat final; //Soma da imagem original + imagem borrada com seus repectivos pesos
void atualiza_tanh(int, void*){
Mat degrade(image.rows,image.cols,CV_8UC3); //Imagem com o comportamento da função a ser aplicada na imagem original
Mat degrade_negativo(image.rows,image.cols,CV_8UC3); //Imagem com o comportamento da função a ser aplicada na imagem borrada
altura = (float)(height_slider/height_slider_max)*image.rows/2; //Varia de 0 até image.rows/2
l1 = -altura; //Altura da borda de transição nítido-borrado superior
l2 = altura; //Altura da borda de transição nítido-borrado inferior
d = (float)d_slider + 1; //Intensidade da mudança
centro = (float)(position_slider/position_slider_max)*image.rows; //0-> Nítido no topo; .5 -> Nítido no centro; 1 -> Nítido na base da imagem
//Criação das imagens com degrade (vai ser aplicado na imagem original)
//Degrade para imagem original
for(int i = 0; i < image.rows; i++){
for(int j = 0; j < image.cols; j++){
R = 255*0.5*(tanh(((i-centro)-l1)/(d))-tanh(((i-centro)-l2)/(d)));
G = 255*0.5*(tanh(((i-centro)-l1)/(d))-tanh(((i-centro)-l2)/(d)));
B = 255*0.5*(tanh(((i-centro)-l1)/(d))-tanh(((i-centro)-l2)/(d)));
degrade.at<Vec3b>(i,j)= (Vec3b){B,G,R};
}
}
//Degrade para imagem borrada
for(int i = 0; i < image.rows; i++){
for(int j = 0; j < image.cols; j++){
degrade_negativo.at<Vec3b>(i,j)= (Vec3b){255,255,255} - degrade.at<Vec3b>(i,j);
}
}
multiply(image, degrade, resultado, 1/255.0, -1); //Aplicação do degrade na imagem original
multiply(result, degrade_negativo, resultado2, 1/255.0, -1); //Aplicação do degrade_negativo na imagem borrada
final = resultado + resultado2; //Obtenção da
imshow("Resultado", final);
}
void borraImagem(Mat imagem, int numero_borramentos){
//Criação da máscara
Mat mask(3,3, CV_32F), mask1;
float media[] = { 1, 1, 1,
1, 1, 1,
1, 1, 1 };
mask = Mat(3, 3, CV_32F, media);
scaleAdd(mask, 1/9.0, Mat::zeros(3, 3, CV_32F), mask1);
swap(mask, mask1);
//Conversão para ponto flutuante
imagem.convertTo(image32F, CV_32F);
//Borramento
Mat borrada(imagem.rows,imagem.cols,CV_32F);
for(int i=0; i<numero_borramentos; i++){
filter2D(image32F, borrada, CV_32F, mask, Point(1,1), 0);
image32F=borrada;
}
borrada.convertTo(result, CV_8U);
}
void saturaImagem(Mat imagem, float fator){
cvtColor(imagem,imagem,CV_BGR2HSV);
for(int i = 0; i< imagem.rows; i++){
for(int j = 0; j<imagem.cols; j++){
if(imagem.at<Vec3b>(i,j)[1]*fator >= 255)
imagem.at<Vec3b>(i,j)[1] = 255;
else
imagem.at<Vec3b>(i,j)[1] = imagem.at<Vec3b>(i,j)[1]*fator;
}
}
cvtColor(imagem,imagem,CV_HSV2BGR);
}
int main (){
image = imread("aew.png",CV_LOAD_IMAGE_COLOR);
namedWindow("Original",CV_WINDOW_KEEPRATIO);
imshow("Original", image);
saturaImagem(image,1.7);
borraImagem(image,20);
namedWindow("Resultado",CV_WINDOW_KEEPRATIO);
createTrackbar("Altura ","Resultado",&height_slider,height_slider_max,atualiza_tanh);
atualiza_tanh(height_slider,0);
createTrackbar("Posicao","Resultado",&position_slider,position_slider_max,atualiza_tanh);
atualiza_tanh(position_slider,0);
createTrackbar("Borda ","Resultado",&d_slider,d_slider_max,atualiza_tanh);
atualiza_tanh(d_slider,0);
waitKey(0);
return 0;
}
Resultados
Em desenvolvimento…