基于MATLAB的RGB转YCBCR色彩空间转换
使用MATLAB进行图片的处理十分方便,看它的名字就知道了,矩阵实验室(matrix laboratory)。一副图片的像素数据可以看成是一个二维数组一个大矩阵,MTABLAB就是为矩阵运算而生。
MATLAB对于图像处理中有丰富的函数,最简单的RGB转Gray只需要一个函数rgb2gray()即可完成。但是如果光是这样学习图像处理,是没有多大意义的,所以博主决定自己根据原理用MATLAB实现一些图像处理的基础算法。作为使用FPGA实现各种图像处理算法的前期仿真,以便后期进行结果对比。顺便记录一些MATLAB在图像处理中的常用代码和函数。
将彩色图像转化为灰度的方法有两种,一个是令RGB三个分量的数值相等,输出后便可以得到灰度图像,另一种是转化为YCbCr格式,将Y分量提取出来,YCbCr格式中的Y分量表示的是图像的亮度和浓度所以只输出Y分量,得到的图像就是灰度图像了。我在这里选择第二种方法实现。
YCbCr是通过有序的三元组来表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。人的肉眼对由YCbCr色彩空间编码的视频中的Y分量更敏感,而Cb和Cr的微小变化不会引起视觉上的不同,根据该原理,通过对Cb和Cr进行子采样来减小图像的数据量,使得图像对存储需求和传输带宽的要求大大降低,从而达到在完成图像压缩的同时也保证了视觉上几乎没有损失的效果,进而使得图像的传输速度更快,存储更加方便。我们要的到灰度图像,首先要将采集到的彩色图像转化为YCbCr。
这是OV7725的手册中给出的RGB888 to YCbCr的算法公式。简单明了,将一副图片的RGB分量提取出来,然后用上面的公式进行运算,得到YcbCr分量,然后在合成显示即可。这样显示出来的是YcbCr色彩空间的图片,我们只取Y分量作为新的图片的三个分量合成,得到的即是这幅彩色图片的灰度图。下面先记录一些MATLAB在图像处理中常用语法和函数。
清空和关闭命令
clc 清空命令区域
clear 清空工作区
clear all 清空工作区与全局变量
close 关闭当前窗口
close all 关闭所有窗口
这几条命令一般写在代码的开头,用来清空或关闭之前操作残留的窗口和命令。
合成和提取RGB的三个分量
fR、fG、fB分别表示RGB三个分量的图像。一副RGB图像可以利用cat(级联)操作符合成彩色图像。
rgb_image = cat(3, fR, fG, fB)
提取三个分量
fR = RGB(:, :, 1); 红色分量
fG = RGB(:, :, 2); 绿色分量
fB = RGB(:, :, 3); 蓝色分量
size()函数得到图片的行列数
[ROW, COL,DIM] = size(R_data); 得到一副图像的行列数。
显示图片
figure, imshow(imag) 保存第一幅图像并同时显示第二幅图像。
显示图片用imshow()函数,前面加个figure; 可以在原来显示的基础上重新打开一个窗口显示。
生成矩阵函数
zeros函数——生成零矩阵
ones函数——生成全1阵
【zeros的使用方法】
B=zeros(n):生成n×n全零阵。
B=zeros(m,n):生成m×n全零阵。
B=zeros([m n]):生成m×n全零阵。
B=zeros(d1,d2,d3……):生成d1×d2×d3×……全零阵或数组。
B=zeros([d1 d2 d3……]):生成d1×d2×d3×……全零阵或数组。
B=zeros(size(A)):生成与矩阵A相同大小的全零阵。
【ones的使用方法】
ones的使用方法与zeros的使用方法类似。
RGB转YcbCr色彩空间MATLAB代码实现
1 %将一幅640*480的彩色图片转换成显示成灰度显示? 2 clc; 3 clear all; 4 close all; 5 6 RGB_data = imread('lena.jpg');%图像读入 7 8 R_data = RGB_data(:,:,1); 9 G_data = RGB_data(:,:,2); 10 B_data = RGB_data(:,:,3); 11 12 imshow(RGB_data); 13 14 [ROW,COL, DIM] = size(RGB_data); %提取图片的行列数 15 16 Y_data = zeros(ROW,COL); 17 Cb_data = zeros(ROW,COL); 18 Cr_data = zeros(ROW,COL); 19 Gray_data = RGB_data; 20 %YCbCr_data = RGB_data; 21 22 for r = 1:ROW 23 for c = 1:COL 24 Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c); 25 Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128; 26 Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128; 27 end 28 end 29 30 % YCbCr_data(:,:,1)=Y_data; 31 % YCbCr_data(:,:,2)=Cb_data; 32 % YCbCr_data(:,:,3)=Cr_data; 33 34 % figure; 35 % imshow(YCbCr_data); 36 37 Gray_data(:,:,1)=Y_data; 38 Gray_data(:,:,2)=Y_data; 39 Gray_data(:,:,3)=Y_data; 40 41 figure; 42 imshow(Gray_data);
结果显示
我们进行图像处理一般是显示灰度图,所以只提取YcbCr的Y分量,就可以显示出lena的灰度图的了。
原图
灰度图
嗯,很漂亮。
转载请注明出处:NingHeChuan(宁河川)
个人微信订阅号:开源FPGA
如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号
知乎ID:NingHeChuan
微博ID:NingHeChuan