社区
图形处理/算法
帖子详情
关于二值图像的数据
菜园子里的PHD
2019-01-26 09:56:00
请问一下一个BMP格式的二值图像的像素是用一个字节表示的还是用一个位表示的呀?如果用一个位表示一个像素,那怎么访问像素呢?
...全文
128
1
打赏
收藏
关于二值图像的数据
请问一下一个BMP格式的二值图像的像素是用一个字节表示的还是用一个位表示的呀?如果用一个位表示一个像素,那怎么访问像素呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
schlafenhamster
2019-01-27
打赏
举报
回复
参考
/*参数说明:
*strSrc——源文件(8位bmp灰度图)
*strDst——目标文件(1位bmp二值图) // 一字节 8个 点
*threshold——阈值
*/
BOOL GraytoBinary(const char *strSrc, const char *strDst, const int threshold)
{
BITMAPFILEHEADER fileheader; //文件头
BITMAPINFOHEADER bmpinfo; //信息头
FILE *fSrc; //源文件(灰度图)
fSrc=fopen(strSrc,"rb");
if( !fSrc )
{
return false;
}
fread(&fileheader, sizeof(BITMAPFILEHEADER), 1, fSrc); //读取源文件的文件头
fread(&bmpinfo, sizeof(BITMAPINFOHEADER), 1, fSrc); //读取源文件的信息头
// const int SecBPP = 8 / bmpinfo.biBitCount; //源文件每字节的像素数
const int SrcBitCount = bmpinfo.biBitCount; //源文件的位深
const int SrcRowLen = (((bmpinfo.biWidth * bmpinfo.biBitCount + 31)/8)/4)*4; // 520 源文件每行字节数
const int SrcClrNum = bmpinfo.biClrUsed ? bmpinfo.biClrUsed : 256 ; //原图像颜色表个数(8位256色)
// read src colors !
// RGBQUAD SrcClr[256];
// fread(SrcClr,sizeof(RGBQUAD),SrcClrNum,fSrc);
// or seek to data
fseek(fSrc,sizeof(RGBQUAD)*SrcClrNum,SEEK_CUR);
//修改文件信息为:目标文件信息
bmpinfo.biBitCount = 1; //二值图的位深
bmpinfo.biClrImportant = 0; //所有颜色都很重要
bmpinfo.biClrUsed = 2; //有2个颜色表
bmpinfo.biCompression = 0; //不压缩
const int DstBPP = 8;
//二值图每字节的像素数
const int DstRowLen = (((bmpinfo.biWidth * bmpinfo.biBitCount + 31)/8)/4)*4;// 68 二值图每行字节数
fileheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
2*sizeof(RGBQUAD) + bmpinfo.biHeight*DstRowLen; //二值图的文件大小
fileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
2*sizeof(RGBQUAD); //二值图的位图数据偏移量
bmpinfo.biSizeImage = bmpinfo.biHeight * DstRowLen; //二值图的图像数据大小
//创建目标文件
FILE *fDst;
fDst=fopen(strDst,"wb");
if( !fDst )
{
return false;
}
fwrite(&fileheader, sizeof(BITMAPFILEHEADER), 1, fDst); // 写入二值图文件头
fwrite(&bmpinfo, sizeof(BITMAPINFOHEADER), 1, fDst); // 写入二值图信息头
RGBQUAD clrDst[2]; //临时变量:原图像(8位)颜色表 与 目标图像(1位)颜色表
//clrDst[2]数组存储具体的颜色信息,二值图数据部分存储的是数组下标
clrDst[0].rgbBlue = 0;
clrDst[0].rgbGreen = 0;
clrDst[0].rgbRed = 0;
clrDst[0].rgbReserved = 0; // 0 表示 黑色
clrDst[1].rgbBlue = 255;
clrDst[1].rgbGreen = 255;
clrDst[1].rgbRed = 255;
clrDst[1].rgbReserved = 0; // 1 表示 白色
for(int ii = 0; ii < 2; ii++)
{
fwrite(&clrDst[ii],sizeof(RGBQUAD),1,fDst); //将颜色表写入目标文件
}
BYTE *bufSrc = new BYTE[SrcRowLen]; //源文件(灰度图)存放一行像素的缓冲区
BYTE *bufDst = new BYTE[DstRowLen]; //目标文件(二值图)存放一行像素的缓冲区
for(int i = 0; i < bmpinfo.biHeight; i++)
{
fread(bufSrc,SrcRowLen,1,fSrc); //读取源文件(8位位图)第i行数据
memset(bufDst,0,DstRowLen); //将目标文件(二值图)第i行数据清零
for(int j = 0; j < bmpinfo.biWidth; j++)
{
int index = j / DstBPP;
//从源文件每读8字节,目标文件增加一字节
int nShift = 8 - (j % DstBPP + 1 ) * bmpinfo.biBitCount; //moved bit
// nShift = 7 6 5 4 3 2 1
if(bufSrc[j] < threshold)
bufDst[index] &= ~(1 << nShift);// =0
else
bufDst[index] |= (1 << nShift);// =1
}
fwrite(bufDst, DstRowLen, 1, fDst); // write this row
}
//
fclose(fSrc);
fclose(fDst);
//
delete []bufSrc;
delete []bufDst;
return true;
}
// GraytoBinary("Girl8.bmp", "Girl2.bmp",28);//
图像处理(2)--
二值图像
1.定义
二值图像
(Binary Image) 是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示
二值图像
。
二值图像
是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素灰度值不是0就是255,再无其他过渡的灰度值。 2. 应用
二值图像
一般用来描述文字或者图形,其优点是占用空间少,缺点是,当表示人物,风景的图像时,
二值图像
只能描述其轮廓,...
二值图像
分析笔记(1)—— 图像二值化
1
二值图像
像素矩阵只包含0和1; 0:黑色 1:白色 1.1 RGB彩色图像到
二值图像
的转换 彩色图像到灰度图像的转换 灰度图像到
二值图像
1.2 常见的图像二值化方法 基于均值-统计学原理 迭代法 Otus 法(最好用的) 直方图法 1.3 基于均值-统计学原理 计算灰度图像的像素均值 m,以 m 作为阈值把图像分成
二值图像
,对任意一个像素点的灰度值x x > m ? x...
Matlab图像二值化
图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。 将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,
二值图像
占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且
数据
量减小,能凸显出感兴趣的目标的轮廓。其次,要进行
二值图像
的处理与分析,首先要把灰度图像
8位
二值图像
转化为1位
二值图像
8位
二值图像
转化为1位
二值图像
本文以bmp图像格式为例对如何将8位
二值图像
转换为1位
二值图像
进行说明 8位
二值图像
对于普通的bmp格式
二值图像
,其每个像素存储为8位(即每个像素占一个字节存储空间)。 1位
二值图像
而同样的bmp格式
二值图像
,也可以在存储时,每位只占用1个bit的空间,这样格式的
二值图像
占用的总存储空间约等于8位
二值图像
的1/8(由于文件头的大小基本不变,当图像较大时,占用存储基本是
matlab数字图像处理——图像的读写,灰度、
二值图像
利用imread读入trees_gray.jpg,利用size函数得到图像
数据
矩阵维度,利用imresize将图像缩小原来的一半,显示缩小后的图像,将此缩小后图像存储成为trees_small.jpg文件。利用imread读入trees_gray.jpg,利用im2bw将灰度图像转换
二值图像
(阈值自行设定),显示
二值图像
,将此
二值图像
存储成为trees_bw.jpg文件。对比
二值图像
和灰度图像的
数据
矩阵差别:
二值图像
数据
矩阵元素只由0和1构成。(5)在保证将图像的长宽比不变的情况下,将图像缩小。
图形处理/算法
19,469
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章