一、 实验内容
1. 完成如下颜色空间的转换。
1) RGB -> YIQ
2) RGB -> HSI
3) RGB -> YCbCr
4) RGB -> XYZ
2.自己实现对 BMP 文件头的读取,并解析 BMP 图像文件。
二、 实验目的
1. 了解图像颜色空间的转换关系。
2. 了解图像的文件结构
三、 实验设计、算法和流程
1.1 RGB -> YIQ
算法:根据图一公式进行转换。把转换过程写一个函数。
1.得到输入的基色值 vector<RGB>。
2.构造适应的数据格式,按照公式去进行线性变换。
较其他颜色空间,YIQ 颜色空间具有能将图像中的亮度分量分离提取出来的优
点,并且 YIQ 颜色空间与 RGB 颜色空间之间是线性变换的关系,计算量小。
图 1.转换公式
Matlab 代码:
表 1.转化公式代码
Y=0.299*r+0.587*g+0.114*b;
I=0.596*r-0.274*g-0.322*b;
Q=0.211*r-0.523*g+0.312*b;
1.2 RGB -> HIS
根据图 2 的公式,写代码即可。
1.得到输入的基色值 vector<RGB>。
2.构造适应的数据格式,需要将原始的基色值映射到 0-1 之间,应是 r =
(R+0.5)/255.5~~希望减少 double 和 int 互换的时候,数据磨损。
3.坐标变换的 HIS 和 RGB 转换,会产生值域不正确的现象,RGB 的值会>1,,
因此不能单纯的将 RGB 转换到 255int 型。使用标准模型的方法可以构造合适的色
谱。
图 2.转换公式
4.插值方法:如果要输出的色谱个数小于等于基色个数,那么就按照原来的方
法进行判断;如果色谱个数大于基色个数,则在基色中每两个基色之间均匀插值 N
个或 N+1 个。插值方法:int MidNum = Num/BaseNum。
Matlab 代码:
表 2.转换公式代码
% Implement the conversion equations.
num = 0.5*((r - g) + (r - b));
den = sqrt((r - g).^2 + (r - b).*(g - b));
theta = acos(num./(den + eps));
H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/(2*pi);
num = min(min(r, g), b);
den = r + g + b;
den(den == 0) = eps;
S = 1 - 3.* num./den;
H(S == 0) = 0;
I = (r + g + b)/3;
1.3 RGB -> YCbCr
1.得到输入的基色值 vector<RGB>。
2.构造适应的数据格式, 直接调用 API 或者用和上面相似的矩阵乘法,归一化
后进行测试即可。
图 3.转换公式
表 3.转换公式代码
ima_ycbcr = rgb2ycbcr(ima);%将 rgb 格式转为 ycbcr 格式
YCbCr 其中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量。人
的肉眼对视频的 Y 分量更敏感,因此在通过对色度分量进行子采样来减少色度分量
后,肉眼将察觉不到的图像质量的变化。主要的子采样格式有 YCbCr 4:2:0、YCbCr
4:2:2 和 YCbCr 4:4:4。
1.4 RGB -> XYZ
1.得到输入的基色值 RGB。
2.构造适应的数据格式, 直接调用 API:rgb2xyz 或者用和上面相似的矩阵乘
法,归一化后进行封装即可。
图 4.转换公式
表 4.转换公式代码
ima_ycbcr = rgb2ycbcr(ima);%将 rgb 格式转为 ycbcr 格式
y = 0.212671*rgb(:,:,1)+0.715160*rgb(:,:,2)+0.072169*rgb(:,:,3);
z = 0.019334*rgb(:,:,1)+0.119193*rgb(:,:,2)+0.950227*rgb(:,:,3);
ima_ycbcr = rgb2ycbcr(ima);%将 rgb 格式转为 ycbcr 格式
直接调用 API:rgb2xyz 或者用上面的矩阵乘法,归一化后进行测试即可。
1.5 BMP 文件读取
BMP 文件头部大小一般为:14+40=54 字节,读入二进制文件后,按照每个位
表示来按照格式进行读取即可。