BMP图像由彩图变为灰度图
Date:6月21日
任务:BMP真彩图像转为灰度图
一,算法及公式:
1,什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
浮点算法:Gray=R*0.3+G*0.59+B*0.11
整数方法:Gray=(R*30+G*59+B*11)/100
移位方法:Gray =(R*28+G*151+B*77)>>8;
平均值法:Gray=(R+G+B)/3;
仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。
2,改变象素矩阵的RGB值,来达到彩色图转变为灰度图
加权平均值算法:根据光的亮度特性,其实正确的灰度公式应当是
R=G=B=R*0.299+G*0.587+B0.144
为了提高速度我们做一个完全可以接受的近似,公式变形如下:
R=G=B=(R*3+G*6+B)/10
3,真正的24位真彩图与8位的灰度图的区别就在于,真彩图文件中没有调色板,灰度图有调色板,真彩图中的象素矩阵是RGB值,
灰度图中的象素矩阵是调色板索引值。源代码1只简单的改变象素矩阵的RGB值,来达到彩色图转为灰度图,并没有添加调色板。源代码2添加了调色板。
二,源代码
1,
//可以输入文件名的源代码,有些变量定义进行了完善
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "windows.h"
#include "conio.h"
typedef struct{
unsigned char b;
unsigned char r;
unsigned char g;
}pixel;
pixel a[640][480];
unsigned char aa[640][480];
void main()
{
BITMAPFILEHEADER FILEH;
BITMAPINFOHEADER INFOH;
RGBQUAD RGBH[256];
char name[11];
char *fname[11];
printf("输入需要转换的图片名:");
scanf("%s",&name);
*fname=name;
strcat(*fname,".bmp");
printf("%s",*fname);
FILE *fp;
if((fp=fopen(*fname,"rb"))==NULL)
{
//if((fp=fopen(*fname,"wb"))==NULL)//防止首次进入时初始化失败
//{
printf("打开文件%s失败!按任意键返回主菜单!",fname);
getch();
exit(1);
//}
}
printf("%s",*fname);
int LEN1=sizeof(BITMAPFILEHEADER);
int LEN2=sizeof(BITMAPINFOHEADER);
int X,Y;
printf("\nlen=%d,%d\n",LEN1,LEN2);
fread(&FILEH,sizeof(BITMAPFILEHEADER),1,fp); fread(&INFOH,sizeof(BITMAPINFOHEADER),1,fp); X=INFOH.biWidth;
Y=INFOH.biHeight;
//printf("%d*%d",X,Y);
if(FILEH.bfType!=0x4d42)
{
fclose(fp);
printf("文件头不正确,不是bmp!");
exit(1);
}
if(INFOH.biBitCount!=24&&INFOH.biBitCount!=8) {
fclose(fp);
printf("信息头不正确,不是bmp!");
exit(1);
}
//*RGBH=A;
unsigned char blue,green,red,color;
int j,k;
if(INFOH.biBitCount==8)
{
fread(&RGBH,sizeof(RGBQUAD),256,fp);
for(j=0;j for(k=0;k { fread(&color,1,1,fp); red=RGBH[color].rgbRed; green=RGBH[color].rgbGreen; blue=RGBH[color].rgbBlue; aa[j][k]=(unsigned char)(0.299*(float)red+0.574*(float)green+0.114*(float)blue); } } if(INFOH.biBitCount==24) { for(j=0;j for(k=0;k { fread(&blue,1,1,fp); fread(&green,1,1,fp); fread(&red,1,1,fp); a[j][k].b=blue; a[j][k].g=green; a[j][k].r=red; aa[j][k]=(unsigned char)(0.299*(float)red+0.574*(float)green+0.114*(float)blue); } } //printf("ok"); fclose(fp); printf("输入输出的灰度图片名:"); scanf("%s",&name); strcat(*fname,".bmp"); if((fp=fopen(*fname,"wb"))==NULL) { fclose(fp); printf("打开图片124.bmp失败"); exit(1); } INFOH.biBitCount=8; fwrite(&FILEH,LEN1,1,fp); fwrite(&INFOH,LEN2,1,fp); int m=0; for(int i=0;i<256;i++) { fwrite(&i,1,1,fp); fwrite(&i,1,1,fp); fwrite(&i,1,1,fp); fwrite(&m,1,1,fp); } for(j=0;j for(k=0;k { fwrite(&aa[j][k],1,1,fp); } fclose(fp); printf("生成灰度图%s成功!\n",*fname); } 2, bmpFormat.h -------------------------------------------- #ifndef _BMPTEST_H_ #define _BMPTEST_H_ #include typedef unsigned char BYTE; typedef unsigned short WORD; typedef struct { long imageSize; long blank; long startPostition; }BmpHead; typedef struct { long length; long width; long height; WORD colorPlane; WORD bitColor; long zipFormat; long readSize; long xPels; long yPels; long colorUse; long colorImportant; }InfoHead; typedef struct { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; }RGBMixPlate; #endif -------------------------------------------- create.c -------------------------------------------- #include "bmpFormat.h" #include #include int main(int argc, char *argv[]){ //tiff文件涉及变量 TIFF *image; //tiff文件指针 uint32 width, height; //图片的宽度和高度 char *buffer; //保存tiff文件中的图像灰度信息缓存 tsize_t stripSize; //tiff 中图像的条大小 unsigned long bufferSize; //缓存大小 int stripMax, stripCount; //图像总共的条数和读条信息时的控制变量 unsigned long imageOffset, result; //读文件信息时的控制变量和每次读的结果 //循环控制变量 unsigned int i; unsigned int j; //bmp文件涉及变量 BmpHead bmphead; //bmp文件头(不包括固定信息) InfoHead infohead; //bmp信息头 RGBMixPlate *color; //调色板 BYTE *index; //图像数据在调色板中的索引值 FILE *bmp; //bmp文件指针 char bm[2]={'B','M'}; //bmp文件头中的一块固定信息,表示这是一张BMP图片 ‘ // 打开tiff图片 if((image = TIFFOpen(argv[1], "r")) == NULL){ fprintf(stderr, "Could not open incoming image\n"); return -1; } //获取图片的宽度和高度 TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); stripSize = TIFFStripSize (image); //每条的大小 stripMax = TIFFNumberOfStrips (image); //一共有多少条 imageOffset = 0; //后面读取文件信息时使用的偏移量 //根据文件信息申请相应的数据空间 bufferSize = TIFFNumberOfStrips (image) * stripSize; if((buffer = (char *) malloc(bufferSize)) == NULL) { fprintf(stderr, "Could not allocate enough memory for the uncompressed image\n"); return -1; } //读取文件中的灰度信息 for (stripCount = 0; stripCount < stripMax; stripCount++) { if((result = TIFFReadEncodedStrip (image, stripCount,buffer + imageOffset,stripSize)) == -1) { fprintf(stderr, "Read error on input strip number %d\n", stripCount); return -1; } imageOffset += result; } //bmp文件头成员赋值 bmphead.blank=0; //保留字,为0 bmphead.imageSize=14+40+4*256+width*height; //图片的大小=文件头大小+信息头大小+调色板大小+实际图片大小bmphead.startPostition=14+40+4*256; //图片实际数据相对于文件头的偏移量 //bmp信息头成员赋值(可参见BMP文件解析每个成员的定义) infohead.length=40; infohead.width=width; infohead.height=height; infohead.colorPlane=1; infohead.bitColor=8; infohead.zipFormat=0; infohead.readSize=width*height; infohead.xPels=400; infohead.yPels=300; infohead.colorUse=0; infohead.colorImportant=0; //申请调色板和数据域空间 color=(RGBMixPlate *)malloc(sizeof(RGBMixPlate)*256); index=(BYTE *)malloc(sizeof(BYTE)*infohead.readSize); //生成256色灰度调色板 for(i=0;i<256;i++) { color[i].rgbBlue=i; color[i].rgbGreen=i; color[i].rgbRed=i; color[i].rgbReserved=0; } //256色灰度bmp的数据信息实际就是该灰度在相应灰度值的调色板中的颜色 for(i=0;i for(j=0;j index[i*width+j]=buffer[(height-1-i)*width+j]; //tiff图片是从左上到右下,bmp图片是从左下到右上 //创建bmp图片 bmp=fopen(argv[2],"wb"); if(bmp==NULL) { printf("open new file error\n"); return -1; } //写入相应的数据 fwrite(bm,1,2,bmp); fwrite(&bmphead,1,12,bmp); fwrite(&infohead,1,40,bmp); fwrite(color,1,256*sizeof(color),bmp); fwrite(index,1,infohead.readSize,bmp); fclose(bmp); //释放有关资源 free(buffer); free(color); free(index); TIFFClose(image); fclose(bmp); return 0; } 北京精雕快捷键表格 选择工具下的快捷键 1、文件 Ctrl+O:打开Ctrl+S:保存Ctrl+N:新建Ctrl+Z:返回2、视图F4:旋转观察F5:窗口观察F6:全部观察F7:选择观察F8:上次观察F12:全屏观察 Ctrl+R:重画 Ctrl+E:自动导行Ctrl+D:正交捕捉3、绘制 Ctrl+Q:直线 Ctrl+P:样条 Ctrl+L:圆 Ctrl+A:圆弧 Ctrl+W:多义线Ctrl+T:矩形 4、编辑 Ctrl+Y:重做 Ctrl+C:复制 Ctrl+X:剪切 Ctrl+V:粘贴 Ctrl+1:区域等距Ctrl+2:区域连接Ctrl+3:区域焊接Ctrl+4:区域求交Ctrl+5:单线等距Ctrl+6:连接 Ctrl+7:修剪 Ctrl+8:剪切 Ctrl+9:延伸 DEL:删除 5、变换 Alt+1:平移 Alt+2:旋转 Alt+3:镜像 Alt+4:缩放 Alt+F2:集合 Alt+F3:取消集合Ctrl+6:并入3D环境 虚拟雕塑工具下的快捷键 1、文件 Ctrl+O:打开Ctrl+S:保存Ctrl+N:新建Ctrl+Z:返回3、视图 F4:旋转观察F5:窗口观察 F6:全部观察 F7:选择观察 F8:上次观察 F12:全屏观察Ctrl+R:重画 Ctrl+E:自动导行 Ctrl+D:正交捕捉4、绘制 Ctrl+Q:直线 Ctrl+P:样条 Ctrl+L:圆 Ctrl+A:圆弧 Ctrl+W:多义线Ctrl+T:矩形 5、编辑 Ctrl+Y:重做 Ctrl+C:复制 Ctrl+X:剪切 Ctrl+V:粘贴 Ctrl+1:区域等距Ctrl+2:区域连接Ctrl+3:区域焊接Ctrl+4:区域求交Ctrl+5:单线等距Ctrl+6:连接 Ctrl+7:修剪 Ctrl+8:剪切 Ctrl+9:延伸DEL:删除 6、变换 Alt+1:平移 Alt+2:旋转 Alt+3:镜像Alt+4:缩放 Alt+F2:集合 Alt+F3:取消集合 Ctrl+6:并入3D环境 7、橡皮 Shift+T:擦除 Shift+G:整体固化 8、几何 Alt+X:扫掠面 Alt+Z:单线浮雕 Alt+Q:延伸面 9、导动 Shift+A:导动堆料 Shift+S:导动去料 Shift+J:导动磨光 Shift+I:消除锯齿 Shift+L:特征磨光 10、颜色 Shift+O:涂抹颜色 Shift+X:种子填色 Shift+V:等高填色 Shift+Z:单线填色 Shift+C:区域填色 Shift+L:颜色区域矢量化11、效果 Shift+E:磨光 12、选项 数字图像处理实验报告 实验二灰度变换 实验目的:通过实验掌握灰度变换的基本概念和方法 实验内容: 掌握基本的灰度变换:图像反转、对数变换、幂次变换和二值化1.图像反转、对数变换、幂次变换 I=imread('fengjing.jpg'); J=im2double(I); subplot(2,3,1),imshow(J); title('原图'); K=255-I; subplot(2,3,2),imshow(K); title('图象反转'); L=3.*log(1+J); subplot(2,3,3),imshow(L);title('图象对数,系数为3'); M=10.*log(1+J); subplot(2,3,4),imshow(M);title('图象对数,系数为10'); N=10.*(J.^0.2); subplot(2,3,5),imshow(N);title('图象指数变换,γ=0.2'); P=10.*(J.^2.5); subplot(2,3,6),imshow(P);title('图象指数变换,γ=2.5'); 2.图象二值化 方法一: I=imread('fengjing.jpg'); % 确定大小subplot(1,2,1),imshow(I);title('原图象'); [m,n]=size(I); for i=1:m for j=1:n if I(i,j)<128 I(i,j)=0; else I(i,j)>=128 & I(i,j)<256 I(i,j)=255; end end end subplot(1,2,2),imshow(I);title('图象二值化');方法二: I=imread('fengjing.jpg'); % 确定大小subplot(1,2,1),imshow(I);title('原图象'); J=find(I<128); I(J)=0; J=find(I>=128); I(J)=255; title('图像二值化(阈值为128)'); subplot(1,2,2),imshow(I);title('图象二值化'); 图像二值化算法研究与实现 摘要:图像二值化是图像预处理中的一项重要技术,在模式识别、光学字符识别、医学成像等方面都有重要应用。论文介绍了图像及数字图像处理技术的一些概念和相关知识;对VC++ 软件的发展和软件在图像处理中的应用做了简要介绍;还介绍了图像二值化算法以及利用VC++软件工具进行算法的实现。论文重点实现了图像分割技术中常用灰度图像二值化算法,如Otsu算法、Bernsen算法,并对这些算法运行的实验结果进行分析与比较。 关键词:图像处理;二值化;VC++; 1.引言 1.1 图像与数字图像 图像就是用各种观测系统观测客观世界获得的且可以直接或间接作用与人眼而产生视觉的实体。视觉是人类从大自然中获取信息的最主要的手段。拒统计,在人类获取的信息中,视觉信息约占60%,听觉信息约占20%,其他方式加起来才约占20%。由此可见,视觉信息对人类非常重要。同时,图像又是人类获取视觉信息的主要途径,是人类能体验的最重要、最丰富、信息量最大的信息源。通常,客观事物在空间上都是三维的(3D)的,但是从客观景物获得的图像却是属于二维(2D)平面的。 数字图像:数字图像是将连续的模拟图像经过离散化处理后得到的计算机能够辨识的点阵图像。在严格意义上讲,数字图像是经过等距离矩形网格采样,对幅度进行等间隔量化的二维函数。因此,数字图像实际上就是被量化的二维采样数组。 1.2 数字图像处理技术内容与发展现状 数字图像处理就是采用一定的算法对数字图像进行处理,以获得人眼视觉或者某种接受系统所需要的图像处理过程。图像处理的基础是数字,主要任务是进行各种算法设计和算法实现。 图像处理技术的发展大致经历了初创期、发展期、普及期和实用化期4个阶段。初创期开始与20世纪60年代,当时的图像采用像素型光栅进行少秒显示,大多采用中、大型机对其处理。在这一时期,由于图像存储成本高、处理设备昂贵,其应用面很窄。进入20世纪70年代的发展期,开始大量采用中、小型机进行处理,图像处理也逐渐改用光栅扫描方式,特别是CT和卫星遥感图像的出现,对图像处理技术的发展起到了很好的推动作用。到了20世纪80年代,图像处理技术进入普及期,此时的微机已经能够担当起图形图像处理的任务。超大规模集成电路(Very Large Scale Integration, VLSI)的出现更使处理速度大大提高,设备造价也进一步降低,极大地促进了图形图像系统的普及和应用。20世纪90年代是图像处理技术的实用化时期,图像处理的信息量巨大,对处理速度的要求极高。 1.3 图像二值化原理及意义 图像二值化是指用灰度变换来研究灰度图像的一种常用方法,即设定某一阈值将灰度 精雕软件简单教程 发布:2014-05-22 ?阅读:459 您的雕刻机软件会操作了吗,慢慢学习吧,泽凯数控设备有限公司帮助您 在数控雕刻机使用过程中,精雕、文泰、type3、ug等软件是客户必须用的,只不过客户根据自己的习惯会选用不同的设计软件。其中精雕是目前使用率比较广泛的设计软件之一,它能很轻松的完成各种浮雕的雕刻路径设置。但对于很多初学者,精雕还是比较难的,因为更多人不知道如何入门。我们简单介绍一下精雕的如何教程。 解压后无需安装,将JDPait和NCservert创建快捷方式托至桌面 1. 运行雕刻机精雕软件(JDPaint)之前先运行NC路径转换器(NCserver) 2.打开精雕软件 3. 输入图片 点击【文件】——【输入】——【点阵图像】——找到要刻的灰度图(一般为bmp格式)——打开 4.调整图片大小 选中图片——点击【变换】——【放缩】——设置合适的尺寸——确定 ? 5.生成浮雕曲面 点击【艺术曲面】——【图像纹理】——【位图转成网格】——点击图片——设置合适的曲面高度 向变换 将图片拖至其他位置与网格分离——选中网格——点击【虚拟雕塑工具】——点击【模型】——Z向变换——点击将高点移至XOY平面 7.做路径 点击【选择工具】——选中网格——点击【刀具路径】——【路径向导】——选择曲面精雕刻——下一步——选择合适的刀具(刀具库中没有的刀具可以双击其中一把刀具将其参数修改后确定)——下一步(使用维宏控制系统的无需选材料)——将雕刻机雕刻路径参数中的路径间距重新设置(一般将重叠率调至20%-35%)——完成 8.输出路径 拉框选中已经做好的路径——点击【刀具路径】——输出刀具路径——找到要保存的位置并命名后点击保存———ENG文件格式选择,输出原点处点击【特征点】选择路径左下角——确定——将NC路径转换器的文件头尾设置全部清空——点击【生成】 ? 9.将做好的NC文件导入雕刻机控制系统(维宏控制)按照维宏控制操作说明进行操作即可完成雕刻。 目录 摘要 ................................................................. III Abstract............................................................... IV 第一章绪论. (1) 1.1 图像与数字图像 (1) 1.2 数字图像处理技术内容与发展现状 (2) 1.3 灰度图像二值化原理及意义 (4) 第二章软件工具——MATLAB (6) 2.1 MATLAB概述 (6) 2.2 MATLAB的工作环境 (6) 2.3 MATLAB图像处理工具箱 (8) 2.4 工具箱实现的常用功能 (9) 第三章图像二值化方法 (11) 3.1 课题研究对象 (11) 3.2 二值化方法研究动态 (13) 3.3 全局阈值法 (18) 3.4 局部阈值法 (18) 第四章 Otsu方法和Bernsen方法 (20) 4.1 Otsu算法分析 (20) 4.2 Otsu方法流程图 (22) 4.3 Bernsen算法分析 (23) 4.4 Bernsen方法流程图 (23) 第五章 Otsu方法和Bernsen方法实验比较 (25) 5.1 Otsu方法实验结果分析 (25) 5.2 Bernsen方法结果分析 (27) 5.3 0tsu方法和Bernsen方法实验结果比较 (28) 5.4 结论 (29) 结束语 (31) 参考文献 (32) 致谢 (33) 附录:源代码 (34) 摘要 在人类获取的信息中,视觉信息约占60%,听觉约占20%,其它约占20%。由此可见,视觉信息对人类非常重要。同时,图像是人类获取视觉信息的主要途径。图像二值化是图像预处理中的一项重要技术,在模式识别、光学字符识别、医学成像等方面都有重要应用。论文介绍了图像及数字图像处理技术的一些概念和相关知识;对Matlab7.0 软件的发展和软件在图像处理中的应用做了简要介绍;还介绍了灰度图像二值化方法以及利用Matlab7.0软件工具进行算法的实现。课题重点实现了图像分割技术中灰度图像二值化方法,如Otsu算法、Bernsen算法,并对这些算法运行的实验结果进行分析与比较。 关键词:图像处理,二值化,Matlab,Otsu算法,Bernsen算法精雕JDPaint快捷键大全
数字图像处理报告 图像二值化
图像二值化算法研究与实现
精雕软件简单教程
图像二值化中阈值选取方法研究
灰度图像二值化方法matlab代码