//Atividade extra classe - Sistemas Multimídias
//Rebeka Rodrigues e Sylvia Victor
//Inclusão dos headers
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "cvaux.h"
//Valores mínimos e máximo da imagem
void MinMax(IplImage *Image, int MinMax[2])
{
int largura = Image->width;
int altura = Image->height;
MinMax[0] = 255;
MinMax[1] = 0;
for (int i = 0; i<altura;i++)
{
for (int j = 0; j<largura;j++)
{
int u = (unsigned char)Image->imageData[i*largura+j];
if(u < MinMax[0])
MinMax[0] = u;
if(u > MinMax[1])
MinMax[1] = u;
}
}
}
//Calculo da média das intensidades dos pixels da imagem
void MediaLowHigh(IplImage *Image, double Media[2], double T)
{
int largura = Image->width;
int altura = Image->height;
Media[0] = 0;
Media[1] = 0;
int num1 = 0;
for (int i = 0; i<altura;i++)
{
for (int j = 0; j<largura;j++)
{
int u = (unsigned char)Image->imageData[i*largura+j];
if(u < T)
{
Media[0] += u;
num1++;
}
else
Media[1] += u;
}
}
Media[0] = Media[0]*1.0/num1;
Media[1] = Media[1]*1.0/(largura*altura - num1);
}
//Processo Segmentação da imagem
IplImage *Limiarizacao(IplImage *image)
{
IplImage *dst = cvCreateImage(cvGetSize(image),8,image->nChannels);
int minMax[2] = { 0, 0 };
double Media[2] = { 0, 0};
MinMax(image, minMax);
if(minMax[0] == minMax[1])
{
cvZero(dst);
return dst;
}
//Novo valor de T = (u1+ u2)/2
double T = 0.5 * (minMax[0] + minMax[1]);
bool done = false;
while (!done)
{
MediaLowHigh(image, Media, T);
double Tnext = 0.5 * (Media[0] + Media[1]);
done = (abs(T-Tnext) < 0.5);
T = Tnext;
}
cvThreshold(image,dst,T,255,CV_THRESH_BINARY);
return dst;
}
//Main
int main()
{
//Carrega imagem original
IplImage* image= cvLoadImage("../imagens_originais/lena.jpg",0);
IplImage* novaImagem;
//A nova imagem sofre o processo de limiarização
novaImagem = Limiarizacao(image);
//Exibição das imagens: original e resultante
cvShowImage("Imagem Original",image);
cvShowImage("Imagem Limiarizada",novaImagem);
//Salva imagem resultante
cvSaveImage("../resultados/resultado.jpg",novaImagem);
cvWaitKey(0);
return 0;
}