社区
图形处理/算法
帖子详情
关于二值图像的数据
菜园子里的PHD
2019-01-26 09:56:00
请问一下一个BMP格式的二值图像的像素是用一个字节表示的还是用一个位表示的呀?如果用一个位表示一个像素,那怎么访问像素呢?
...全文
126
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);//
二值图像
--基础概念
一、
二值图像
概念 1.
二值图像
含义
二值图像
(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示
二值图像
。
二值图像
是指在图像中,灰度等级只有两...
图像处理(2)--
二值图像
二值图像
(Binary Image) 是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示
二值图像
。
二值图像
是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素...
Matlab图像二值化
在数字图像处理中,
二值图像
占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且
数据
量减小,能凸显出感兴趣的目标的轮廓。其次,要进行
二值图像
的处理与分析,首先要把灰度图像
matlab数字图像处理——图像的读写,灰度、
二值图像
利用imread读入trees_gray.jpg,利用size函数得到图像
数据
矩阵维度,利用imresize...对比
二值图像
和灰度图像的
数据
矩阵差别:
二值图像
数据
矩阵元素只由0和1构成。(5)在保证将图像的长宽比不变的情况下,将图像缩小。
图像二值化
图像的二值化使图像中
数据
量大为减少,从而能凸显出目标的轮廓。要得到二值化图像,首先要把图像灰度化,然后将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。所有...
图形处理/算法
19,473
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章