Buscar en este blog

miércoles, 6 de junio de 2007

¿Como acceder a los pixeles de una imagen?

El siguiente código muestra como acceder a los valores de pixel de una imagen. Se ha utilizado una imagen a color de 3 canales y 8 bits, que ha de ser transformada en una imagen (Figura 1a) en escala de grises de 8 bits mediante la función de Open CV cvCvtColor.

Figura 1a

Para mostrar el acceso a los valores de pixel, cada valor de pixel ha sido dividido entre 2, el resultado se observa en la Figura 1b.

Figura 1b
#include"cv.h"
#include"cxcore.h"
#include"cvaux.h"
#include"highgui.h"

uchar getPixel( IplImage*img, int lin, int col ) {
return ((uchar*)(img->imageData + img->widthStep*lin))[col] ;
}

void setPixel( IplImage*img, int lin, int col, uchar valor ) {
((uchar*)(img->imageData + img->widthStep*lin))[col] = valor ;
}


void main(){

char *nom_img[] = {".\img_grises.jpg", ".\img_div_pix.jpg"};

cvNamedWindow("Imagen Original", 1);
cvNamedWindow("Imagen Procesada", 1);
cvNamedWindow("Imagen Grises", 1);

IplImage *img1 = cvLoadImage(".\img_10.jpg");//img_10.jpg es una imagen a color de 3 canales y 8 bits

cvShowImage("Imagen Original", img1);

IplImage *img2 = cvCreateImage(cvSize(img1->width, img1->height), 8, 1);//direcciona un espacio en memoria para almacenar una imagen de las dimensiones de img1, con 8 bits y 1 canal

cvCvtColor(img1, img2, CV_BGR2GRAY);//transforma la imagen a color en una imagen a escala de grises de 1 canal y 8 bits

int x = img2->height;
int y = img2->width;
int canales = img2->nChannels;
int bits = img2->depth;

printf("Renglones = %d, Columnas = %d, Canales = %d, Bits = %d", x, y, canales, bits);
cvSaveImage(nom_img[0], img2); //quitar
cvShowImage("Imagen Grises", img2);

uchar val_pix;

for (int i=0; i"<"x; i++) {
for(int j=0; j"<"y; j++) {
val_pix = (getPixel(img2, i, j)) / 2;
setPixel(img2, i, j, val_pix);
}
}
cvSaveImage(nom_img[1], img2);//quitar
cvShowImage("Imagen Procesada", img2);

cvWaitKey(0);

cvDestroyWindow("Imagen Original");
cvDestroyWindow("Imagen Procesada");
cvDestroyWindow("Imagen Grises");
}


No hay comentarios: