社区
图形处理/算法
帖子详情
关于二值图像的数据
菜园子里的PHD
2019-01-26 09:56:00
请问一下一个BMP格式的二值图像的像素是用一个字节表示的还是用一个位表示的呀?如果用一个位表示一个像素,那怎么访问像素呢?
...全文
136
1
打赏
收藏
关于二值图像的数据
请问一下一个BMP格式的二值图像的像素是用一个字节表示的还是用一个位表示的呀?如果用一个位表示一个像素,那怎么访问像素呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);//
二值图像
分析笔记(1)—— 图像二值化
1
二值图像
像素矩阵只包含0和1; 0:黑色 1:白色 1.1 RGB彩色图像到
二值图像
的转换 彩色图像到灰度图像的转换 灰度图像到
二值图像
1.2 常见的图像二值化方法 基于均值-统计学原理 迭代法 Otus 法(最好用的)...
8位
二值图像
转化为1位
二值图像
1位
二值图像
而同样的bmp格式
二值图像
,也可以在存储时,每位只占用1个bit的空间,这样格式的
二值图像
占用的总存储空间约等于8位
二值图像
的1/8(由于文件头的大小基本不变,当图像较大时,占用存储基本是
matlab 读二值图片,
二值图像
二值图像
(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示
二值图像
。
二值图像
是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的...
matlab下的彩色图像转换成
二值图像
并保存
在matlab平台下,为了得到
二值图像
,先是用函数im2bw将彩色图像转换成
二值图像
,然后用imwrite函数生成指定路径的
二值图像
。 这里用到的例子是将彩色图像(64×64×3 uint8型图像数组)转换成
二值图像
(64×64 ...
二值图像
与数学形态学处理
1.
二值图像
1.1概念补充 (1)定义
二值图像
是仅含有两级灰度(一般为0,1)的数字图像。 (2)特点 1)
数据
量小; 2)处理速度快,成本低,实时性强; 3)能定义几何学的各种概念. 其中,第三条尤为重要。 (3)举例 通过例子,...
图形处理/算法
19,467
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章