Red de conocimiento informático - Material del sitio web - ¿Cómo binarizar imágenes en color usando lenguaje C?

¿Cómo binarizar imágenes en color usando lenguaje C?

#include

#include

#include

#pragma pack(1)

#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);

}