社区
新手乐园
帖子详情
用VC++读取BMP图像像素矩阵的问题
jtacm
2006-02-08 05:51:32
请问下各位高手们,我现在想读取BMP格式的图片的像素矩阵值,就是每个像素的颜色值,构成的矩阵,各位高手能介绍下自己的方法啊,小弟万分感谢啊!
...全文
564
7
打赏
收藏
用VC++读取BMP图像像素矩阵的问题
请问下各位高手们,我现在想读取BMP格式的图片的像素矩阵值,就是每个像素的颜色值,构成的矩阵,各位高手能介绍下自己的方法啊,小弟万分感谢啊!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jtacm
2006-02-10
打赏
举报
回复
???
jtacm
2006-02-10
打赏
举报
回复
??
jtacm
2006-02-08
打赏
举报
回复
我想知道最后得到的矩阵的指针是哪个呢?
CmUpDate
2006-02-08
打赏
举报
回复
阿哈,
代码没看,支持楼上
du51
2006-02-08
打赏
举报
回复
Emboss_f(FILE *fpi, FILE *fpo) /*浮雕效果处理*/
{
int nCounti,nCountj,nCountk,nCountl;
int nRed,nBlue,nGreen;
int nDx=1,nDy=1;
unsigned int nPixel1,nPixel2,nPixel;
fread((char *)&strHead,1,sizeof(strHead),fpi);
fread((char *)&strInfo,1,sizeof(strInfo),fpi);
for(nCounti=0;nCounti<256;nCounti++)
fread((char *)&straPla[nCounti],1,sizeof(RGBQUAD),fpi);
fwrite((char *)&strHead,1,sizeof(strHead),fpo);
fwrite((char*)&strInfo,1,sizeof(strInfo),fpo);
for(nCounti=0;nCounti<256;nCounti++)
fwrite((char *)&straPla[nCounti],1,sizeof(RGBQUAD),fpo);
for(nCounti=0;nCounti<8;nCounti++)
{
for(nCountj=0;nCountj<64;nCountj++)
fread(&naImage[nCountj][0],1,nWidth,fpi);
for(nCountk=0;nCountk<64-1;nCountk++)
{
for(nCountl=0;nCountl<nWidth-1;nCountl++)
{
nPixel1=(unsigned char)(naImage[nCountk][nCountl]);
nPixel2=(unsigned char)(naImage[nCountk+nDx][nCountl+nDy]);
nRed=fabs(straPla[nPixel1].rgbRed-straPla[nPixel2].rgbRed+128);
nGreen=fabs(straPla[nPixel1].rgbGreen-straPla[nPixel2].rgbGreen+128);
nBlue=fabs(straPla[nPixel1].rgbBlue-straPla[nPixel2].rgbBlue+128);
nPixel=Match_f(nRed,nGreen,nBlue);
naImage[nCountk][nCountl]=nPixel;
}
}
for(nCountl=0;nCountl<nWidth-1;nCountl++)
{
nPixel1=(unsigned char)(naImage[63][nCountl]);
nPixel2=(unsigned char)(naImage[63][nCountl+nDy]);
nRed=fabs(straPla[nPixel1].rgbRed-straPla[nPixel2].rgbRed+128);
nGreen=fabs(straPla[nPixel1].rgbGreen-straPla[nPixel2].rgbGreen+128);
nBlue=fabs(straPla[nPixel1].rgbBlue-straPla[nPixel2].rgbBlue+128);
nPixel=Match_f(nRed,nGreen,nBlue);
naImage[63][nCountl]=nPixel;
}
for(nCountj=0;nCountj<64;nCountj++)
fwrite(&naImage[nCountj][0],1,nWidth,fpo);
}
}
Smooth_f(FILE *fpi,FILE *fpo) /*柔化效果处理*/
{
int nCounti,nCountj,nCountk,nCountl,nCountm,nCountn,nRed,nGreen,nBlue;
unsigned nPixel;
fread((char *)&strHead,1,sizeof(strHead),fpi);
fread((char *)&strInfo,1,sizeof(strInfo),fpi);
for(nCounti=0;nCounti<256;nCounti++)
fread((char *)&straPla[nCounti],1,sizeof(RGBQUAD),fpi);
fwrite((char *)&strHead,1,sizeof(strHead),fpo);
fwrite((char*)&strInfo,1,sizeof(strInfo),fpo);
for(nCounti=0;nCounti<256;nCounti++)
fwrite((char *)&straPla[nCounti],1,sizeof(RGBQUAD),fpo);
for(nCounti=0;nCounti<8;nCounti++)
{
for(nCountj=0;nCountj<64;nCountj++)
fread(&naImage[nCountj][0],1,nWidth,fpi);
for(nCountk=1;nCountk<64-2;nCountk++)
{
for(nCountl=1;nCountl<nWidth-2;nCountl++)
{
nRed=0,nGreen=0,nBlue=0;
for(nCountm=0;nCountm<3;nCountm++) /*用9个点的均值柔化*/
for(nCountn=0;nCountn<3;nCountn++)
{
nPixel=(unsigned char)(naImage[nCountk-1+nCountm][nCountl-1+nCountn]);
nRed+=straPla[nPixel].rgbRed;
nGreen+=straPla[nPixel].rgbGreen;
nBlue+=straPla[nPixel].rgbBlue;
}
nRed=nRed/9;
nGreen=nGreen/9;
nBlue=nBlue/9;
nPixel=Match_f(nRed,nGreen,nBlue);
naImage[nCountk][nCountl]=nPixel;
}
}
for(nCountj=0;nCountj<64;nCountj++)
fwrite(&naImage[nCountj][0],1,nWidth,fpo);
}
}
Initial_f(int nChoice)
{
char szFilena1[30],szFilena2[30];
FILE *fpi, *fpo;
printf("Input the bmp source file: ");
scanf("%s",szFilena1);
printf("Input the bmp termini file: ");
scanf("%s", szFilena2);
if((fpi=fopen(szFilena1,"rb"))==NULL)
{
printf("OPEN SOURCE FILE ERROR\n");
exit(0);
}
if((fpo=fopen(szFilena2,"wb"))==NULL)
{
printf("OPEN TERMINI FILE ERROR\n");
exit(0);
}
if(nChoice==3)
Emboss_f(fpi,fpo);
else if(nChoice==2)
Sharp_f(fpi,fpo);
else if(nChoice==1)
Smooth_f(fpi,fpo);
fclose(fpi);
fclose(fpo);
}
void main()
{
int nChoice;
do
{
printf("\n\t1. Smooth\n");
printf("\n\t2. Sharp\n");
printf("\n\t3. Emboss\n");
printf("\n\t4. Exit\n");
scanf("%d",&nChoice);
switch(nChoice)
{
case 1:
case 2:
case 3:
Initial_f(nChoice);
break;
case 4:
break;
default:
printf("Input again!\n");
break;
}
}while(nChoice!=4);
}
du51
2006-02-08
打赏
举报
回复
#include"stdio.h"
#include"alloc.h"
#include"dos.h"
#include"graphics.h"
#include"math.h"
typedef struct
{
int bfType; /* 类型标志,总是BM */
long bfSize; /* 文件大小 */
int bfReserved1;
int bfReserved2;
long bfOffBits; /* 位图点阵偏移量*/
}HEAD;
typedef struct
{
long biSize; /* 结构体字节总数 */
long biWidth; /* 图像宽度 */
long biHeight; /*图像高度 */
int biPlanes; /* 必须为1 */
int biBitCount; /* 每个像素所占二进制位数,可能是1,4,8或 24 */
long biCompress; /*压缩方式*/
long biSizeImage; /*像素点阵大小 */
long biXPelsPerMeter; /* 水平像素数*/
long biYPelsPerMeter; /* 垂直像素数 */
long biClrUsed; /*使用的颜色数 */
long biClrImportant; /*重要颜色数 */
}INFO;
typedef struct
{
unsigned char rgbBlue; /*蓝色所占比重*/
unsigned char rgbGreen; /*绿色所占比重*/
unsigned char rgbRed; /*红色所占比重*/
unsigned char rgbReserved; /*保留字节 */
}RGBQUAD;
int Match_f(int nRed,int nGreen,int nBlue); /*寻找与像素匹配的调色板的序号*/
Sharp_f(FILE *fpi, FILE *fpo); /* 锐化处理*/
Emboss_f(FILE *fpi, FILE *fpo); /*浮雕效果处理*/
Smooth_f(FILE *fpi,FILE *fpo); /*柔化效果处理*/
Initial_f(int nChoice); /*初始化图像文件*/
RGBQUAD straPla[256]; /*256色调色板*/
HEAD strHead;
INFO strInfo;
unsigned int nWidth=512,nDepth=512; /*处理512×512位图*/
unsigned char naImage[64][512];
int Match_f(int nRed,int nGreen,int nBlue) /*寻找与像素匹配的调色板的序号*/
{
long int nMax,nLength;
int nNum=0,nCounti;
unsigned int nImageRed,nImageGreen, nImageBlue;
nImageRed=(unsigned int)(straPla[0].rgbRed);
nImageGreen=(unsigned int)(straPla[0].rgbGreen);
nImageBlue=(unsigned int)(straPla[0].rgbBlue);
nMax=(nRed-nImageRed)*(nRed-nImageRed)+(nGreen-nImageGreen)*(nGreen-nImageGreen)+(nBlue-nImageBlue)*(nBlue-nImageBlue);
for(nCounti=1;nCounti<256;nCounti++)
{
nImageRed=(unsigned int)(straPla[nCounti].rgbRed);
nImageGreen=(unsigned int)(straPla[nCounti].rgbGreen);
nImageBlue=(unsigned int)(straPla[nCounti].rgbBlue);
nLength=(nRed-nImageRed)*(nRed-nImageRed)+(nGreen-nImageGreen)*(nGreen-nImageGreen)+(nBlue-nImageBlue)*(nBlue-nImageBlue);
if(nMax>nLength)
{
nMax=nLength;
nNum=nCounti;
if(nMax==0)
break;
}
}
return nNum;
}
Sharp_f(FILE *fpi, FILE *fpo) /* 锐化处理*/
{
int nCounti,nCountj,nCountk,nCountl;
int nRed,nBlue,nGreen;
int nDx=1,nDy=1;
unsigned int nPixel1,nPixel2,nPixel;
fread((char *)&strHead,1,sizeof(strHead),fpi);
fread((char *)&strInfo,1,sizeof(strInfo),fpi);
for(nCounti=0;nCounti<256;nCounti++)
fread((char *)&straPla[nCounti],1,sizeof(RGBQUAD),fpi);
fwrite((char *)&strHead,1,sizeof(strHead),fpo);
fwrite((char*)&strInfo,1,sizeof(strInfo),fpo);
for(nCounti=0;nCounti<256;nCounti++)
fwrite((char *)&straPla[nCounti],1,sizeof(RGBQUAD),fpo);
for(nCounti=0;nCounti<8;nCounti++)
{
for(nCountj=0;nCountj<64;nCountj++)
fread(&naImage[nCountj][0],1,nWidth,fpi);
for(nCountk=1;nCountk<64-2;nCountk++)
for(nCountl=1;nCountl<nWidth-2;nCountl++)
{
nPixel1=(unsigned char)(naImage[nCountk][nCountl]);
nPixel2=(unsigned char)(naImage[nCountk-nDx][nCountl-nDy]);
nRed=straPla[nPixel1].rgbRed+0.5*(straPla[nPixel1].rgbRed-straPla[nPixel2].rgbRed);
/*0.5为锐化系数*/
nGreen=straPla[nPixel1].rgbGreen+0.5*(straPla[nPixel1].rgbGreen-straPla[nPixel2].rgbGreen);
nBlue=straPla[nPixel1].rgbBlue+0.5*(straPla[nPixel1].rgbBlue-straPla[nPixel2].rgbBlue);
if(nRed>255)
nRed=255;
if(nRed<0)
nRed=0;
if(nGreen>255)
nGreen=255;
if(nGreen<0)
nGreen=0;
if(nBlue>255)
nBlue=255;
if(nBlue<0)
nBlue=0;
nPixel=Match_f(nRed,nGreen,nBlue);
naImage[nCountk][nCountl]=nPixel;
}
for(nCountj=0;nCountj<64;nCountj++)
fwrite(&naImage[nCountj][0],1,nWidth,fpo);
}
}
lukeguo
2006-02-08
打赏
举报
回复
定义一个结构,和BMP的头部说明一致,然后就简单了。
读取头部结构,再根据结构读取数据。
具体的结构忘了,在网上找一下。如果找不到就用图画板画图,存成不同颜色位宽的文件分析。
现在只记得:
图像点的存储是倒的,即最后一行在前面,第一行在最后;
每一行的数据是按普通顺序的,第一点在开始;占用字节好像是图像宽度点按8对齐(即1~8点都是一样的存储尺寸)。
通过Numpy实现
图像
处理
本课程包括以下主要内容:1
图像
的存储结构介绍。2
读取
,显示与保存
图像
。3
图像
的灰度图转换。4
图像
的通道提取。5
图像
重复,镜像,旋转等操作。6 通过双线性插值算法,实现
图像
的放大或缩小。7
图像
的卷积计算,实现浮雕效果。
VS2010
C++
学习(2):
BMP
图像
文件的处理
VS2010
C++
学习(2):
BMP
图像
文件的处理 学习V
C++
编制的
BMP
图像
文件的处理程序.。 一、 主要内容: 1.
BMP
图像
文件的结构分析; 2.
BMP
图像
文件的读写; 3.
BMP
图像
文件的置固定值处理、反色处理、平滑处理; 二、 设计实现: 1.
BMP
图像
文件的结
【数字
图像
处理】V
C++
实现图片的
读取
、显示与存储
数字
图像
处理(Digital Image Processing) 是指用计算机处理
图像
,主要包括: (1)点运算:针对
图像
的
像素
进行基本数学运算。点运算可以有效的改变
图像
的直方图分布,可以有效提高
图像
的分辨率,以及
图像
均衡的操作。 (2)几何处理:主要包括
图像
的坐标 变换,
图像
的移动、缩小、放大、旋转,多个
图像
的配准以及
图像
扭曲校正等。
图像
的扭曲校正功能可以将变形的
图像
进行几何校正。 (3)
图像
增强:
图像
增强的作用主要是突出
图像
中重要的信息,同时减弱或者去除不重要的信息。常用方法有直方图增强和为彩色增强。
opencv
图像
像素
值
读取
说到
图像
像素
,肯定要先认识一下
图像
中的坐标系长什么样。 1. 坐标体系中的零点坐标为图片的左上角,X轴为
图像
矩形的上面那条水平线;Y轴为
图像
矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。(OpenCV中有些数据结构的坐标原点是在图片的左下角,可以设置的)。 2. 在使用image.at(x1, x2)来访问
图像
中点的值的时候,x1并不是图片中对应点的x轴坐标
数字
图像
处理技术--学习笔记2--v
c++
处理数字
图像
的基本方法
【1】使用DIB处理数字
图像
DIB是外部的位图格式,存储为
BMP
后缀的位图文件。 DIB可以在不同的机器或系统中显示位图所固有的
图像
。 但是MFC不提供对DIB的支持,单纯使用DIB只能进行面向过程编程。 操作函数: 【2】使用自定义CDib类处理数字
图像
设计一个设备无关类CDib,封装DIB位图处理所需要的基本成员变量和成员函数。 ** Dib.h** //====================================================================== /
新手乐园
33,311
社区成员
41,784
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章