基于深度学习的车牌识别项目的APP部分之图像预处理(二):C语言实现bmp的二值化处理
- 一、二值化概念
- 二 、代码实现
- 三、运行结果:
- 1、图像是8位深度的运行结果:
- 2、图像是16位深度的运行结果:
本文实现的带选择开关是输入图像是16位深度,输出保存图像分别可以是16位或者8位 ,8位的需要加上调色板如果不懂概念,请参考前面的文章
基于深度学习的车牌识别项目的APP部分之图像预处理(一):C语言读取bmp图像信息
一、二值化概念
二值化(英语:Binarization)是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。(来源维基百科)
图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。
所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。
(如果要得到二值化图像 ,要先经过灰度化)
二 、代码实现
bmp.h
# ifndef BMP_H
# define BMP_H
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
unsigned char bfType[2];
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
}BITMAPFILEHEADER;
#pragma pack()
#pragma pack(1)
typedef struct tagBITMAPINFOHEADER
{
unsigned int biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
}BITMAPINFOHEADER;
#pragma pack()
#pragma pack(1)
typedef struct tagRGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}RGBQUAD;
#pragma pack()
#endif
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include"bmp.h"
int main()
{
FILE *fpBMP,*fpTwoValue;
char filename1[20], filename2[20];
BITMAPFILEHEADER *fileHeader;
BITMAPINFOHEADER *infoHeader;
#ifdef DEBUG
RGBQUAD *ipRGB;
#endif
int i,j;
unsigned char *a;
unsigned char *c;
printf("输入图像文件名:");
scanf("%s", filename1);
if ((fpBMP = fopen(filename1, "rb")) == NULL)
{
printf("打开图片失败");
exit(0);
}
printf("输出图像文件名:");
scanf("%s", filename2);
if ((fpTwoValue = fopen(filename2, "wb")) == NULL)
{
printf("创建图片失败");
exit(0);
}
fileHeader=(BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
infoHeader=(BITMAPINFOHEADER *)malloc(sizeof(BITMAPINFOHEADER));
#ifdef DEBUG
ipRGB=(RGBQUAD *)malloc(2*sizeof(RGBQUAD));
#endif
fread(fileHeader,sizeof(BITMAPFILEHEADER),1,fpBMP);
fread(infoHeader,sizeof(BITMAPINFOHEADER),1,fpBMP);
printf("原始图片每个像素的位数:%d\n" ,infoHeader->biBitCount);
printf("原始图片每个像素像素数据偏移:%d\n" ,fileHeader->bfOffBits);
#ifdef DEBUG
infoHeader->biBitCount=8;
infoHeader->biSizeImage=((infoHeader->biWidth*1+3)/4)*4*infoHeader->biHeight;
infoHeader->biClrUsed=2;
infoHeader->biClrImportant=0;
#else
infoHeader->biClrUsed=2;
infoHeader->biClrImportant=0;
#endif
#ifdef DEBUG
fileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+2*sizeof(RGBQUAD);
fileHeader->bfSize=fileHeader->bfOffBits+infoHeader->biSizeImage;
ipRGB[0].rgbBlue=ipRGB[0].rgbGreen=ipRGB[0].rgbRed=ipRGB[0].rgbReserved=255;
ipRGB[1].rgbBlue=ipRGB[1].rgbGreen=ipRGB[1].rgbRed=ipRGB[1].rgbReserved=0;
#else
fileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
#endif
printf("修改后的图片每个像素的位数:%d\n" ,infoHeader->biBitCount);
printf("修改后的图片每个像素数据偏移:%d\n" ,fileHeader->bfOffBits);
fwrite(fileHeader,sizeof(BITMAPFILEHEADER),1,fpTwoValue);
fwrite(infoHeader,sizeof(BITMAPINFOHEADER),1,fpTwoValue);
#ifdef DEBUG
fwrite(ipRGB,2*sizeof(RGBQUAD),1,fpTwoValue);
#endif
a=(unsigned char *)malloc((infoHeader->biWidth*2+3)/4*4);
#ifdef DEBUG
c=(unsigned char *)malloc((infoHeader->biWidth*1+3)/4*4);
#else
c=(unsigned char *)malloc((infoHeader->biWidth*2+3)/4*4);
#endif
for(i=0;i<infoHeader->biHeight;i++)
{
for(j=0;j<((infoHeader->biWidth*2+3)/4*4);j++)
{
fread(a+j,1,1,fpBMP);
}
#ifdef DEBUG
for(j=0;j<(infoHeader->biWidth*1);j++)
#else
for(j=0;j<(infoHeader->biWidth*2);j++)
#endif
{
#ifdef DEBUG
if(100<=(a[j*2+1] & 0xf8))
c[j]=0;
else
c[j]=255;
#else
if(j%2==0)
{
if(100<=(a[j+1] & 0xf8))
c[j]=255;
else
c[j]=0;
}
else
c[j] = c[j-1];
#endif
}
#ifdef DEBUG
fwrite(c,(infoHeader->biWidth*1+3)/4*4,1,fpTwoValue);
#else
fwrite(c,(infoHeader->biWidth*2+3)/4*4,1,fpTwoValue);
#endif
}
free(fileHeader);
free(infoHeader);
free(a);
free(c);
fclose(fpBMP);
fclose(fpTwoValue);
printf("bmp图片背景去除完成\n");
return 0;
}
三、运行结果:
原图:
1、图像是8位深度的运行结果:
2、图像是16位深度的运行结果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)