数字媒体 实验报告.docx
《数字媒体 实验报告.docx》由会员分享,可在线阅读,更多相关《数字媒体 实验报告.docx(59页珍藏版)》请在冰豆网上搜索。
![数字媒体 实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/28/a3352dd2-8623-4ba1-80f3-b5a1b0079f60/a3352dd2-8623-4ba1-80f3-b5a1b0079f601.gif)
数字媒体实验报告
数字媒体实验报告
色品图绘制
一.实验目的
给定颜色匹配试验中,XYZ三刺激分量针对不同单色谱光源的匹配值,试:
xy色品图舌形外轮廓图;对该色品图进行着色。
二.相关知识点
颜色匹配:
通过改变参加混色各颜色的量,使混合色与指定颜色达到视觉上相同的过程。
从大量的颜色匹配实验中,可以得到如下的结论:
红、绿、兰三种颜色以不同的量值(有的可能为负值)相混合,可以匹配任何颜色。
红、绿、兰不是唯一的能匹配所有颜色的三种颜色。
三种颜色,只要其中的每一种都不能用其它两种混合产生出来,就可以用它们匹配所有的颜色。
三.实验原理
颜色匹配实验:
是为了给颜色视觉的理论研究提供实验依据,并建立一个实用的颜色度量方法,科学家们设计了一个特殊的试验来确定和定义一个具有正常颜色视觉的观察者的“颜色匹配函数”。
把适当的三原色按一定的比例进行相加混合可以仿造任何一种色彩,并且对人的眼睛能引起相同的视觉效果。
在颜色匹配实验中,当这三原色光的相对亮度比例为1.0000:
4.5907:
0.0601时就能匹配出等能白光,所以CIE选取这一比例作为红、绿、蓝三原色的单位量,即:
(R):
(G):
(B)=1:
1:
1。
颜色匹配可以用数学方法表示:
量的红颜色
,
量的红颜色
,
量的红颜色
,正好与颜色C相匹配,这一事实可用方程表示为:
,
匹配结果记为:
CIE-RGB到XYZ:
但由于计算过程中会出现负值,使计算变得既复杂,又不容易理解;国际照明委员会讨论通过了一个新的用于色度学计算的系统,这就CIEl931-XYZ系统
由于CIE1931-RGB系统存在的问题,国际照明委员会在此基础上,又以三个假想的原色光(X)、(Y)、(Z)建立起一个新的色度学系统,这个系统就称之为CIEl931标准色度学系统,亦称之为CIEl93l-XYZ系统。
RGB—>XYZ的转化矩阵
理想的色品图:
四.实验步骤
1.根据三刺激值绘制出色品图的轮廓。
2.生成xy网格点,并用inpolygon函数判断网格点是不是在轮廓内。
3.找出在轮廓内的点,用插值的方法求出此点的rgb,并绘图。
五.实验结果
六.实验总结
在本次实验中,遇到了一些自己不会的问题,但是通过不断地和同学探讨和请教都弄懂了。
自己才实验中除了学到了知识,更学到了独立看书的理解能力。
七.相关程序
clearall;clc;closeall
%色度图
%波长从360nm到730nm,间隔只有1nm;矩阵的第一列是波长,第二列是X刺激值...
%第二列是Y刺激值,第三列是Z刺激值
data=xlsread('E:
\CIE-xyz','Sheet2','A2:
G41');
%计算xy坐标
X=data(:
2);%X刺激值
Y=data(:
3);%Y刺激值
Z=data(:
4);%Z刺激值
x=data(:
5);%样本点x
y=data(:
6);%样本点y
z=data(:
7);%样本点z
%三刺激值转化为RGB
RGB=XYZ2RGB(X,Y,Z);%XYZ2RGB为自定义转换函数
R=RGB(:
1);
G=RGB(:
2);
B=RGB(:
3);
holdon;
grid
plot(x,y);
%获取数组长度
[len,a]=size(x);
%把图形封闭起来
plot([x
(1),x(len)],[y
(1),y(len)]);
x1=[x;x
(1)];
y1=[y;y
(1)];
tic
[XX,YY]=meshgrid(0:
.01:
1,0:
.01:
1);
in=inpolygon(XX,YY,x1,y1);
index=find(in==1);
FR=TriScatteredInterp(x,y,R,'natural');
FG=TriScatteredInterp(x,y,G,'natural');
FB=TriScatteredInterp(x,y,B,'natural');
fori=1:
length(index)
r=FR(XX(index(i)),YY(index(i)));
g=FG(XX(index(i)),YY(index(i)));
b=FB(XX(index(i)),YY(index(i)));
if(r>0.95&&g>0.95&&b>0.95)%白化处理,防止因插值带来的误差
r=1;g=1;b=1;
end
if(r>1)
r=1;
elseif(r<0)
r=0;
end
if(g>1)
g=1;
elseif(g<0)
g=0;
end
if(b>1)
b=1;
elseif(b<0)
b=0;
end%防止rgb的溢出,正确的做法
%M=mapminmax([rgb],0,1);%归一化处理这样的归一化处理会损失掉rgb颜色的比例
%这就是为什么没有出现白点的原因,还有一个就是插值求得的rgb有的为负
%但是插值求得的值很多接近于0,必须对其进行归一化处理,否则,整体就变成了黑色
%fill(XX(index(i)),YY(index(i)),M);%给一个小的区域填充,会比一个一个地描绘点更快
plot(XX(index(i)),YY(index(i)),'MarkerSize',10,'Color',[r,g,b]);
end
toc
select=1;%控制标记
xre=0.333;yre=0.333;%参考白点xy坐标
plot(xre,yre,'ko');
while(select==1)
zoomon
[x0,y0]=ginput
(1);
zoomoff
if(inpolygon(x0,y0,x1,y1))
if(xre==x0)
x3=xre;y3=max(y)+0.1;
elseif(yre==y0)
x3=max(x)+0.1;y3=yre;
else
k=(yre-y0)/(xre-x0);%计算参考点和选取点的斜率
if(x0>xre)
x3=max(x)+0.1;
y3=yre-k*(xre-x3);
end
if(x0x3=-0.1;
y3=yre-k*(xre-x3);
end
end
select=0;
else
errordlg('拾取点在色品图外部,无法计算色度和饱和度.请重新选取','Waring!
','on');
pause
(1)
end
end
xline=[xrex0x3];
yline=[yrey0y3];
[xcross,ycross]=polyxpoly(xline,yline,x1,y1,'unique');
xxline=[xrex0xcross];
yyline=[yrey0ycross];
plot(xxline,yyline,'r');
plot(x0,y0,'ko');
plot(xcross,ycross,'ko');
xlabel('x')
ylabel('y')
title('CIE-xyz')
text(xre,yre,'referenepoint')
text(x0,y0,'inputpoint')
text(xcross,ycross,'crosspoint')
%色调H,饱和度S的计算
if((ycross-y
(1))*(x(end)-xcross)==(y(end)-ycross)*(xcross-x
(1)))%交点在纯紫线上
H=780;
else
wavelength=data(:
1);
H=griddata(x,y,wavelength,xcross,ycross,'v4');
end
D=sqrt((xre-xcross)^2+(yre-ycross)^2);%参考白点到交点的距离
d=sqrt((xre-x0)^2+(yre-y0)^2);%参考白点到拾取点的距离
S=d/D;
BMP格式分析
一.实验目的
给定若干幅用BMP格式保存的数字图像
1.编写一个程序读取BMP图像。
2.用UltraEdit等工具分析保存的BMP图像格式。
二.相关知识点
BMP是一种与硬件设备无关的图像文件格式,使用非常广。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BblP文件所占用的空间很大。
BMP文件的图像深度可选lbit、4bit、8bit及24bit。
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
典型的BMP图像文件由三部分组成:
位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
三.实验原理
如某BMP文件开头:
424D4690000000000000460000002800000080000000900000000100*10000300000000900000A00F0000A00F00000000000000000000*00F80000E00700001F00000000000000*02F184F104F184F184F106F284F106F204F286F206F286F286F2........
BMP文件可分为四个部分:
位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
①、图像文件头
1)1:
图像文件头。
424Dh="BM",表示是Windows支持的BMP格式。
2)2-3:
整个文件大小。
46900000,为00009046h=36934。
3)4-5:
保留,必须设置为0。
4)6-7:
从文件开始到位图数据之间的偏移量。
46000000,为00000046h=70,上面的文件头就是35字=70字节。
5)8-9:
位图图信息头长度。
6)10-11:
位图宽度,以像素为单位。
80000000,为00000080h=128。
7)12-13:
位图高度,以像素为单位。
90000000,为00000090h=144。
8)14:
位图的位面数,该值总是1。
0100,为0001h=1。
②、位图信息头
9)15:
每个像素的位数。
有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。
1000为0010h=16。
10)16-17:
压缩说明:
有0(不压缩),1(RLE8,8位RLE压缩),2(RLE4,4位RLE压缩,3(Bitfields,位域存放)。
RLE简单地说是采用像素数+像素值的方式进行压缩。
T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。
图中03000000为00000003h=3。
11)18-19:
用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。
00900000为00009000h=80×90×2h=36864。
12)20-21:
用象素/米表示的水平分辨率。
A00F0000为00000FA0h=4000。
13)22-23:
用象素/米表示的垂直分辨率。
A00F0000为00000FA0h=4000。
14)24-25:
位图使用的颜色索引数。
设为0的话,则说明使用所有调色板项。
15)26-27:
对图象显示有重要影响的颜色索引的数目。
如果是0,表示都重要。
③、彩色板(非必有)
16)28-35:
彩色板规范。
对于调色板中的每个表项,用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。
如,彩色板为00F80000E00700001F00000000000000,其中:
00FB0000为FB00h=1111100000000000(二进制),是红色分量的掩码。
E0070000为07E0h=0000011111100000(二进制),是绿色分量的掩码。
1F000000为001Fh=0000000000011111(二进制),是红色分量的掩码。
00000000总设置为0。
将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。
看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。
取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式了。
④、图像数据阵列
17)17-...:
每两个字节表示一个像素。
阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
四.实验结果
1)读取BMP图片:
图片Test1.bmp:
文件头:
信息头:
像素数据:
图片Test4.bmp:
文件头:
信息头:
像素数据:
图片Test8.bmp:
文件头:
信息头:
像素数据:
2)用UltraEdit等工具分析保存的BMP图像格式。
Test1.bmp
位图文件头
位图文件头分4部分,共14字节:
名称
占用空间
内容
实际数据
bfType
2字节
标识,就是“BM”二字
424D
bfSize
4字节
整个BMP文件的大小
36600000
bfReserved1/2
4字节
保留字,没用
00000000
bfOffBits
4字节
偏移数,即位图文件头+位图信息头+调色板的大小
36000000
位图信息头
位图信息头共40字节:
名称
占用空间
内容
实际数据
biSize
4字节
位图信息头的大小,为40
28000000
biWidth
4字节
位图的宽度,单位是像素
7F000000
biHeight
4字节
位图的高度,单位是像素
40000000
biPlanes
2字节
固定值1
0100
biBitCount
2字节
每个像素的位数
1-黑白图,4-16色,8-256色,24-真彩色
1800
biCompression
4字节
压缩方式,BI_RGB(0)为不压缩
00000000
biSizeImage
4字节
位图全部像素占用的字节数,BI_RGB时可设为0
00000000
biXPelsPerMeter
4字节
水平分辨率(像素/米)
0
biYPelsPerMeter
4字节
垂直分辨率(像素/米)
0
biClrUsed
4字节
位图使用的颜色数
如果为0,则颜色数为2的biBitCount次方
0
biClrImportant
4字节
重要的颜色数,0代表所有颜色都重要
0
Test4:
位图文件头
位图文件头分4部分,共14字节:
名称
占用空间
内容
实际数据
bfType
2字节
标识,就是“BM”二字
424D
bfSize
4字节
整个BMP文件的大小
36600000
bfReserved1/2
4字节
保留字,没用
00000000
bfOffBits
4字节
偏移数,即位图文件头+位图信息头+调色板的大小
36000000
位图信息头
位图信息头共40字节:
名称
占用空间
内容
实际数据
biSize
4字节
位图信息头的大小,为40
28000000
biWidth
4字节
位图的宽度,单位是像素
7F000000
biHeight
4字节
位图的高度,单位是像素
40000000
biPlanes
2字节
固定值1
0100
biBitCount
2字节
每个像素的位数
1-黑白图,4-16色,8-256色,24-真彩色
1800
biCompression
4字节
压缩方式,BI_RGB(0)为不压缩
00000000
biSizeImage
4字节
位图全部像素占用的字节数,BI_RGB时可设为0
00000000
biXPelsPerMeter
4字节
水平分辨率(像素/米)
0
biYPelsPerMeter
4字节
垂直分辨率(像素/米)
0
biClrUsed
4字节
位图使用的颜色数
如果为0,则颜色数为2的biBitCount次方
0
biClrImportant
4字节
重要的颜色数,0代表所有颜色都重要
0
Test8:
位图文件头
位图文件头分4部分,共14字节:
名称
占用空间
内容
实际数据
bfType
2字节
标识,就是“BM”二字
424D
bfSize
4字节
整个BMP文件的大小
36600000
bfReserved1/2
4字节
保留字,没用
00000000
bfOffBits
4字节
偏移数,即位图文件头+位图信息头+调色板的大小
36000000
位图信息头
位图信息头共40字节:
名称
占用空间
内容
实际数据
biSize
4字节
位图信息头的大小,为40
28000000
biWidth
4字节
位图的宽度,单位是像素
7F000000
biHeight
4字节
位图的高度,单位是像素
40000000
biPlanes
2字节
固定值1
0100
biBitCount
2字节
每个像素的位数
1-黑白图,4-16色,8-256色,24-真彩色
1800
biCompression
4字节
压缩方式,BI_RGB(0)为不压缩
00000000
biSizeImage
4字节
位图全部像素占用的字节数,BI_RGB时可设为0
00000000
biXPelsPerMeter
4字节
水平分辨率(像素/米)
0
biYPelsPerMeter
4字节
垂直分辨率(像素/米)
0
biClrUsed
4字节
位图使用的颜色数
如果为0,则颜色数为2的biBitCount次方
0
biClrImportant
4字节
重要的颜色数,0代表所有颜色都重要
0
五.实验程序
头文件BMP.h
#ifndefBMP_H_INCLUDED
#defineBMP_H_INCLUDED
typedefunsignedshortWORD;
typedefunsignedlongDWORD;
typedeflongLONG;
typedefunsignedcharBYTE;
typedefstructtagBITMAPFILEHEADER
{//bmfh
WORDbfType;
DWORDbfSize;
WORDbfReserved1;
WORDbfReserved2;
DWORDbfOffBits;
}BITMAPFILEHEADER;
typedefstructtagBITMAPINFOHEADER
{//bmih
DWORDbiSize;
LONGbiWidth;
LONGbiHeight;
WORDbiPlanes;
WORDbiBitCount;
DWORDbiCompression;
DWORDbiSizeImage;
LONGbiXPelsPerMeter;
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
}BITMAPINFOHEADER;
typedefstructtagRGBQUAD
{//rgbq
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
typedefstructtagBITMAPINFO
{
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[1];
}BITMAPINFO;
#endif//BMP_H_INCLUDED
主程序:
#include
#include
#include
#include
#include
#include
#include"BMP.h"
BITMAPFILEHEADERbmfh;
BITMAPINFOHEADERbmih;
BYTE*imgData;
boolbReadBMFH=false;
boolbReadBMIH=false;
boolbReadPixel=false;
//检查路径是否合法:
文件能打开;以bmp为后缀名
intCheckFilePath(char*filepath);
//读入位图的文件头
intReadFileHeader(char*filepath,BITMAPFILEHEADER*bmfh);
//打印位图的文件头
voidPrintFileHeader(BITMAPFILEHEADER*bmfh);
//读入位图的信息头
intReadInfoHeader(char*filepath,BITMAPINFOHEADER*bmih);
//打印位图的信息头
voidPrintInfoHeader(BITMAPINFOHEADER*bmih);
//创建8位位图的调色板
intCreatePalette(RGBQUADpal[]);
//读入位图的像素数据
intReadPixelData(char*filepath,BYTE*imgData);
//计算每行像素所占的字节数
LONGGetLineBytes(intimgWidth,intbitCount);
//打印位图的像素数据
voidPrintPixelData(BYTE*imgData,intwidth,intheight,intbitCount);
//打印菜单选项
voidPrintMenu();
//另存为位图
intSaveAsImage(char*filepath);
//显示位图
voidShowImage(char*filepath);
intmain()