.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

quinta-feira, 27 de março de 2008

SDL em Processamento de Imagens

Depois de muito tempo sem postar, estou de volta.
Desta vez não vou falar de teoria ou documentação, mas apenas de um exemplo prático de como utilizar SDL em Processamento de Imagens.

SDL não tem componentes gráficas, caixa de diálogo ou funções de acesso ao pixel, mas a gente pode improvisar.
Em SDL trabalhar com pixels é muito fácil e rápido.
Imagem 2D é com a SDL mesmo !

Download: » código fonte

4 comentários:

nitrofurano disse...

também tenho utilizado bastante o SDL para processamento de imagem, mas com sdlBasic - e não só, grafismo experimental intereactivo tb, cheguei a meter alguns videos em http://youtube.com/nitturo

Tiago disse...

Olá.
Também gostaria de iniciar a utilizar a SDL para processamento de imagens e queria saber se poderiam mostrar como ficaria o algorítmo da mediana nesse do negativo.
Obrigado.

Diogo_RBG disse...

Primeiro... o que é um filtro de mediana?!
Encontrei isso... nesse ppt aki.
Fui fazer com esse exemplo e quase acertei !

Vou postar aki a função... mas não 100% dela. Se não vira Ctrl+C Ctrl+V !

//-----------------

/*
* A função verifica na vizinhança 5x5 a cor mais utilizada... e antão a
* usa no pixel do centro.
*/
void filtro_da_mediana(){
int vet[2][25];
int nVet;
Uint32 c, c2;
int i,j,k,l,m;

SDL_PixelFormat *fmt = img->format;
SDL_Surface *tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, img->w, img->h, fmt->BitsPerPixel, fmt->Rmask, fmt->Gmask, fmt->Bmask, fmt->Amask);

// Loop WxH da imagem
for(i=0; i (menor_que) img->w; i++){
for(j=0; j (menor_que) img->h; j++){
c = getpix(img, i, j);

// Loop da vizinhança 5x5
nVet = 0;
for(k=-2; k (menor_que) =2; k++){
if(i+k (menor_que) 0) continue;
if(i+k>=img->w) break;
for(l=-2; l (menor_que) =2; l++){
if(j+l (menor_que) 0) continue;
if(j+l>=img->h) break;
if(k==0 && l==0) continue;

// Pega o pixel e acumula a quantidade de cada cor
// ... trexo de código omitido... desafio !
}
}

// Seleciona a cor de maior quantidade (maior repetição)
// ... trexo de código omitido... desafio !

// Seta o pixel na imagem temporária
setpix(tmp, i, j, c2);
}
}

// Finalmente transfere tudo para img
SDL_BlitSurface(tmp, 0, img, 0);
SDL_FreeSurface(tmp);
}

Diogo_RBG disse...

obs.: Tira a linha if(k==0 && l==0) continue; pois vai ficar ligeiramente melhor !