使用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代码实现

 %将一幅640*480的彩色图片转换成显示成灰度显示?
clc;
clear all;
close all; RGB_data = imread('lena.jpg');%图像读入 R_data = RGB_data(:,:,);
G_data = RGB_data(:,:,);
B_data = RGB_data(:,:,); imshow(RGB_data); [ROW,COL, DIM] = size(RGB_data); %提取图片的行列数 Y_data = zeros(ROW,COL);
Cb_data = zeros(ROW,COL);
Cr_data = zeros(ROW,COL);
Gray_data = RGB_data;
%YCbCr_data = RGB_data; for r = :ROW
for c = :COL
Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + ;
Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + ;
end
end % YCbCr_data(:,:,)=Y_data;
% YCbCr_data(:,:,)=Cb_data;
% YCbCr_data(:,:,)=Cr_data; % figure;
% imshow(YCbCr_data); Gray_data(:,:,)=Y_data;
Gray_data(:,:,)=Y_data;
Gray_data(:,:,)=Y_data; figure;
imshow(Gray_data);

结果显示

我们进行图像处理一般是显示灰度图,所以只提取YcbCr的Y分量,就可以显示出lena的灰度图的了。

原图

灰度图

嗯,很漂亮。

转载请注明出处:NingHeChuan(宁河川)

个人微信订阅号:开源FPGA

如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:https://www.cnblogs.com/ninghechuan/p/9515639.html

基于MATLAB的RGB转YCBCR色彩空间转换的更多相关文章

  1. YUV / RGB 格式及快速转换算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...

  2. 视频图像处理基础知识5(RGB与Ycbcr相互转换公式 )【转】

    转自:http://blog.csdn.net/Times_poem/article/details/51471438 版权声明:本文为博主原创文章,未经博主允许不得转载. 需求说明:视频处理算法基本 ...

  3. 基于FPGA的RGB图像转灰度图像算法实现

    一.前言 最近学习牟新刚编著<基于FPGA的数字图像处理原理及应用>的第六章直方图操作,由于需要将捕获的图像转换为灰度图像,因此在之前代码的基础上加入了RGB图像转灰度图像的算法实现. 2 ...

  4. [ZZ] 基于Matlab的标记分水岭分割算法

    基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...

  5. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  6. matlab将rgb图转为灰度图的原理代码

    MyYuanLaiPic = imread('e:/image/matlab/Cluo.jpg');%读取RGB格式的图像 MyFirstGrayPic = rgb2gray(MyYuanLaiPic ...

  7. 基于MATLAB的腐蚀膨胀算法实现

    本篇文章要分享的是基于MATLAB的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作. 什么是二值图像 ...

  8. 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  9. RGB 与 (RGB转 YCbCr再转为 RGB)的图像

           RGB 与 (RGB转 YCbCr再转为 RGB)的图像   不可逆,能够从 矩阵的逆运算看出来. 附上 matlab 代码:         clc,clear; Source=imr ...

随机推荐

  1. easyui input未设id导致的问题

    今天又踩了一个坑,大致是没有给input设id,使用类选择器绑定easyui控件,然后使用name设值,现在值设进去后界面没有显示. 做的界面部分截图如图: 点击下面两个橙色的按钮,通过调用下面的方法 ...

  2. Linux终极渗透测试命令总结

    本文主要和大家分享Linux终极渗透测试命令总结,如下是一份 Linux 机器的渗透测试备忘录,是在后期开发期间或者执行命令注入等操作时的一些典型命令,设计为测试人员进行本地枚举检查之用. 命令 描述 ...

  3. 阿里云SSL证书tomcat配置

    1. SSL证书申请 登录阿里云控制台,查看购买域名中有SSL证书的申请,ssl证书申请中有单域名的申请,配置要申请的域名信息(注意:一个域名下,一次只能添加一个证书,最多申请3个免费证书用于测试), ...

  4. HashCode的理解

    一.hashcode是什么 要理解hashcode首先要理解hash表这个概念 1. 哈希表 hash表也称散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构 ...

  5. python学习——urlparse模块

    urlparse模块: 1.urlparse() 具体程序及结果如下: >>> url = 'http://i.cnblogs.com/EditPosts.aspx?opt=1'&g ...

  6. python数据类型内部结构解剖

    一.前言 我们知道,python是一种动态语言,可以将任何类型的数据赋给任何变量,譬如: # Python代码 x = 4 x = "four" 这里已经将 x 变量的内容由整型转 ...

  7. 4-QT的程序打包发布(将QT5的工程项目打包成一个exe程序)

    https://blog.csdn.net/windsnow1/article/details/78004265 最近,在学习QT5的过程中,想尝试着把自己写的工程程序给打包发布出来,在任何一台win ...

  8. .NET Utils 辅助类

    using System;using System.Diagnostics;using System.IO;using System.Reflection;using System.Runtime.I ...

  9. 基于TCP的套接字

    tcp服务端 1 ss = socket() #创建服务器套接字 2 ss.bind() #把地址绑定到套接字 3 ss.listen() #监听链接 4 inf_loop: #服务器无限循环 5 c ...

  10. Restful API设计要点

    1 Restful API时面向资源,不能面向动作: 2 充分利用http协议的GET, HEAD, OPTION, PUT, POST, DELETE几种方法: 3 GET方法用于获取资源,是幂等和 ...