灰度图像二值化主要将图像中像素点的阀值作比较,从而得出两种结果。
1 首先确定图像由三原色组成分别为RGB 每种颜色为8位(也叫深度),一共为24位深度。这些可以通过图片的右键属性可以查到。
上图为只有灰色,像素为640*480,8位表示
a.结构体表示为
- typedef struct tagRGBQUAD
- {
- unsigned char rgbBlue;
- unsigned char rgbGreen;
- unsigned char rgbRed;
- unsigned char rgbReserved;
- }RGBQUAD;
复制代码
第四种保留;
b.图片信息表示为
- typedef struct tagBITMAPFILEHEADER
- {
- unsigned short int bfType; // 位图文件的类型,必须为 BM
- unsigned int bfSize; // 文件大小,以字节为单位
- unsigned short int bfReserverd1; // 位图文件保留字,必须为0
- unsigned short int bfReserverd2; // 位图文件保留字,必须为0
- unsigned int bfbfOffBits; // 位图文件头到数据的偏移量,以字节为单位
- }BITMAPFILEHEADER;
复制代码
图片格式为:BMP ,文件大小等
C.图片所用调色板信息
- typedef struct tagBITMAPINFOHEADER
- {
- int biSize; // 该结构大小,字节为单位
- int biWidth; // 图形宽度以象素为单位
- int biHeight; // 图形高度以象素为单位
- short int biPlanes; // 目标设备的级别,必须为1
- short int biBitcount; // 颜色深度,每个象素所需要的位数
- int biCompression; // 位图的压缩类型
- int biSizeImage; // 位图的大小,以字节为单位
- int biXPelsPermeter; // 位图水平分辨率,每米像素数
- int biYPelsPermeter; // 位图垂直分辨率,每米像素数
- int biClrUsed; // 位图实际使用的颜色表中的颜色数
- int biClrImportant; // 位图显示过程中重要的颜色数
- }BITMAPINFOHEADER;
复制代码
这里是具体的字节大小以及像素信息,分辨率等等。
D.总体可以用结构体来表示完整一张图片
- typedef struct
- {
- BITMAPFILEHEADER file; // 文件信息区
- BITMAPINFOHEADER info; // 图象信息区
- RGBQUAD *pColorTable; // 调色板
- unsigned char *imgBuf; // 位图数据
- }bmp;
复制代码
2.读取图片数据
- fread(&m.file.bfType, sizeof(char), 2, fp); // 类型
- fread(&m.file.bfSize, sizeof(int), 1, fp); // 文件长度
- fread(&m.file.bfReserverd1, sizeof(short int), 1, fp); // 保留字 1
- fread(&m.file.bfReserverd2, sizeof(short int), 1, fp); // 保留字 2
- fread(&m.file.bfbfOffBits, sizeof(int), 1, fp); // 偏移量
- fread(&m.info.biSize, sizeof(int), 1, fp); // 此结构大小
- fread(&m.info.biWidth, sizeof(int), 1, fp); // 位图的宽度
- fread(&m.info.biHeight, sizeof(int), 1, fp); // 位图的高度
- fread(&m.info.biPlanes, sizeof(short), 1, fp); // 目标设备位图数
- fread(&m.info.biBitcount, sizeof(short) ,1, fp); // 颜色深度
- fread(&m.info.biCompression, sizeof(int), 1, fp); // 位图压缩类型
- fread(&m.info.biSizeImage, sizeof(int), 1, fp); // 位图大小
- fread(&m.info.biXPelsPermeter, sizeof(int), 1, fp); // 位图水平分辨率
- fread(&m.info.biYPelsPermeter, sizeof(int), 1, fp); // 位图垂直分辨率
- fread(&m.info.biClrUsed, sizeof(int), 1, fp); // 位图实际使用颜色数
- fread(&m.info.biClrImportant, sizeof(int), 1, fp); // 位图显示中比较重要颜色数
复制代码
分别用fread函数读取1种各种信息
并且进行垂直镜像。
3 二值化
- for(i = 0; i < newBmpHeight; i++)
- {
- for(j = 0;j < newBmpWidth; j++)
- {
- // 二值化
- *(newBmpBuf + i*newLineByte + j) = *(m->imgBuf +
- i*lineByte + j) < intThreshold ? 0x00:0xFF;
- }
- }
复制代码
从2中获取像素后,对数据进行判断得出两个结果
4 写入图片
- fwrite(&m->file.bfType, sizeof(short), 1, fp);
- fwrite(&m->file.bfSize, sizeof(int), 1, fp);
- fwrite(&m->file.bfReserverd1, sizeof(short int), 1, fp);
- fwrite(&m->file.bfReserverd2, sizeof(short int), 1, fp);
- fwrite(&m->file.bfbfOffBits, sizeof(int), 1, fp);
- fwrite(&m->info.biSize, sizeof(int), 1, fp);
- fwrite(&m->info.biWidth, sizeof(int), 1, fp);
- fwrite(&m->info.biHeight, sizeof(int), 1, fp);
- fwrite(&m->info.biPlanes, sizeof(short), 1, fp);
- fwrite(&m->info.biBitcount, sizeof(short), 1, fp);
- fwrite(&m->info.biCompression, sizeof(int), 1, fp);
- fwrite(&m->info.biSizeImage, sizeof(int), 1, fp);
- fwrite(&m->info.biXPelsPermeter, sizeof(int), 1, fp);
- fwrite(&m->info.biYPelsPermeter, sizeof(int), 1, fp);
- fwrite(&m->info.biClrUsed, sizeof(int), 1, fp);
- fwrite(&m->info.biClrImportant, sizeof(int), 1, fp);
复制代码
反向垂直镜像。
0
|
|
|
|