¿Cómo binarizar imágenes en color usando lenguaje C?
#include
#include
#pragma pack(1) p>
#define R 30
#define G 59
#define B 11
#define UNO 255
#define CERO 0
typedef palabra corta sin signo
typedef palabra larga sin signo
typedef larga
typedef carácter sin signo
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType; // Archivo de mapa de bits bfType // El tipo de archivo de mapa de bits debe ser BM
DWORD bfSize; del archivo de mapa de bits, en bytes
WORD bfReserved1; // Las palabras reservadas del archivo de mapa de bits, deben ser 0
WORD bfReserved2 // Las palabras reservadas del archivo de mapa de bits, deben ser 0
DWORD bfOffBits; //La posición inicial de los datos del mapa de bits, expresada como un desplazamiento relativo al encabezado del archivo de mapa de bits, en bytes
}. BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize // El número de bytes ocupados por esta estructura
LONG biWidth; , la unidad es píxeles
LONG biHeight; // Altura del mapa de bits, la unidad es píxeles
WORD biPlanes // Nivel del dispositivo de destino, debe ser 1
WORD biBitCount; //El número de bits por píxel debe ser 1 (dos colores), 4 (16 colores), 8 (256 colores) o 24 (color verdadero)
DWORD biCompression; El tipo de compresión de mapa de bits debe ser uno de 0 (sin compresión), 1 (tipo de compresión BI_RLE8) o 2 (tipo de compresión BI_RLE4)
DWORD biSizeImage // Tamaño del mapa de bits (en bytes) Unidades)
LONG biXPelsPerMeter; // Resolución horizontal del mapa de bits (en píxeles por metro)
LONG biYPelsPerMeter; // DWORD biClrUsed // El color real utilizado por el mapa de bits El número de colores en la tabla
DWORD biClrImportant;//La cantidad de colores que son importantes al mostrar mapas de bits
}.
BITMAPINFOHEADER;
typedef struct tagPOINT{<
BYTE b;
BYTE g;
BYTE r;
}PUNTO;
int quit();
int quit()
puts("El formato del archivo es incorrecto"); exit(0);
}
void main (int argc,char *argv:");
scanf("%d",&t);
}
if ((fi=fopen(fin, "rb"))==NULL)||((fo=fopen(fon, "wb"))== NULL))
{
puts("\nerror al abrir el archivo");
return
}
fread(&bf,tamañode(bf),1,fi);
fread(&&bi,tamañode(bi),1,fi);
fread(&&bi,tamañode( bi),1,fi);
fread(& amp;bi,sizeof(bi),1,fi);
if(bf.bfType!=0x4d42) quit( );
if(bf.bfReserved1!=0x0000) quit();
if(bf.bfReserved2!=0x0000) quit();
si (bf.0x0000) salir();
if(bi.biClrImportant!=0) salir();
if(bi.biBitCount!=0x18) salir();
if(bi.biCompression!=0) quit();
if(bi.biPlanes!=1) quit();
bf.bfSize= 54+1024+bi.biWidth*bi.biHeight;
bf.bfOffBits=54+1024;
if(bi.biWidth%4==0)
bi.biSizeImage=bi.biWidth*bi.biHeight;
bf.bfOffBits=54+1024;
if(bi.biWidth%4==0)biBitCount/8 ;
bi.biBitCount=8;
p=(PUNTO **)malloc(tamañode(PUNTO *)*bi.biHeight);
para ( i=0;i *(p+i)=(PUNTO *)malloc(tamañode(PUNTO)*bi.biWidth); / /¡Las fallas en la asignación tienen consecuencias! fwrite(&bf,sizeof(bf),1,fo); fwrite(&bi,sizeof(bi),1,fo); para (i=0;i for (j=0;j fread (*(p+i)+j,si zeof(PUNTO),1,fi); for (i=0x00,buff=0x00;i<=0xFF;i++,buff++) { fwrite(&buff,tamaño de(buff),1,fo); fwrite(&buff,sizeof(buff),1,fo); fwrite(&buff,sizeof(buff) ),1,fo); fwrite(&o,sizeof(o),1,fo); } for (i=0;i for (j=0;j { buff=( (*(p +i)+j)->r*R+(*(p+i)+j)->g*G+(*(p+i)+j)->b*B)/100; buff=(buff>=t?ONE:ZERO) fwrite(&buff,sizeof(buff ),1,fo); } fclose(fo); }