RGB—YCbCr图像转换------图像处理

介绍

通过MATLAB把RGB888的图像转换为RGB332的图像数据,然后通过MATLAB保存到TXT文本当中(因为332格数据为8bit正好一个字节,串口正好一次发送一个像素点,怎么转换之前写过 哈哈)。然后通过将RGB332转换为RGB565格式数据存入到SDRAM中,然后通过VGA驱动模块读出数据进行RGB—YCbCr图像转换最后通过VGA显示,需要注意的是在RGB—YCbCr图像转换过程中有数据计算需要打拍同步行场信号。

整体流程

首先通过串口接收端接收上位机发送的640 *480大小的图片数据,然后存入到SDRAM中,通过VGA驱动模块读取数据,然后进行RGB—YCbCr图像转换,最后通过VGA显示。具体RTL视图如下所示。

RGB—YCbCr图像转换原理

RGB—YCbCr图像转换公式如下所示。

 Y  = 0.299R +0.587G + 0.114BCb = 0.568(B-Y) + 128 = -0.172R-0.339G + 0.511B + 128CR = 0.713(R-Y) + 128 = 0.511R-0.428G -0.083B + 128

因为FPGA不能进行浮点数运算所以将上式中带有小数部分扩大256倍然后再右移8bit,如下式所示

 Y  = (77 *R    +    150*G    +    29 *B)>>8Cb = (-43*R    -    85 *G    +    128*B)>>8 + 128Cr = (128*R    -    107*G    -    21 *B)>>8 + 128

为防止负数出现把128加入到括号内,如下式所示。

 Y  = (77 *R    +    150*G    +    29 *B        )>>8Cb = (-43*R    -    85 *G    +    128*B + 32768)>>8Cr = (128*R    -    107*G    -    21 *B + 32768)>>8

具体步骤

步骤(1)

因为RGB—YCbCr图像转换过程中数据都是以8bit位宽进行的,所以现将RGB565数据转换成RGB888格式数据,代码如下所示。

//RGB565 to RGB 888
assign rgb888_r         = {img_red  , img_red[4:2]  };
assign rgb888_g         = {img_green, img_green[5:4]};
assign rgb888_b         = {img_blue , img_blue[4:2] };

步骤(2)

进行公式中的全部相乘操作代码如下所示

always @(posedge clk or negedge rst_n) beginif(!rst_n) beginrgb_r_m0 <= 16'd0;rgb_r_m1 <= 16'd0;rgb_r_m2 <= 16'd0;rgb_g_m0 <= 16'd0;rgb_g_m1 <= 16'd0;rgb_g_m2 <= 16'd0;rgb_b_m0 <= 16'd0;rgb_b_m1 <= 16'd0;rgb_b_m2 <= 16'd0;endelse beginrgb_r_m0 <= rgb888_r * 8'd77 ;rgb_r_m1 <= rgb888_r * 8'd43 ;rgb_r_m2 <= rgb888_r * 8'd128;rgb_g_m0 <= rgb888_g * 8'd150;rgb_g_m1 <= rgb888_g * 8'd85 ;rgb_g_m2 <= rgb888_g * 8'd107;rgb_b_m0 <= rgb888_b * 8'd29 ;rgb_b_m1 <= rgb888_b * 8'd128;rgb_b_m2 <= rgb888_b * 8'd21 ;end
end

步骤(3)

进行公示中的全部相加操作代码如下所示

always @(posedge clk or negedge rst_n) beginif(!rst_n) beginimg_y0  <= 16'd0;img_cb0 <= 16'd0;img_cr0 <= 16'd0;endelse beginimg_y0  <= rgb_r_m0 + rgb_g_m0 + rgb_b_m0;img_cb0 <= rgb_b_m1 - rgb_r_m1 - rgb_g_m1 + 16'd32768;img_cr0 <= rgb_r_m2 - rgb_g_m2 - rgb_b_m2 + 16'd32768;endend

步骤(4)

进行公示中的移位操作代码如下所示

always @(posedge clk or negedge rst_n) beginif(!rst_n) beginimg_y1  <= 8'd0;img_cb1 <= 8'd0;img_cr1 <= 8'd0;endelse beginimg_y1  <= img_y0  >> 8;img_cb1 <= img_cb0 >> 8;img_cr1 <= img_cr0 >> 8;end
end

步骤(5)

打三拍进行行场同步代码如下所示

always@(posedge clk or negedge rst_n) beginif(!rst_n) beginpre_frame_vsync_d <= 3'd0;pre_frame_hsync_d <= 3'd0;pre_frame_de_d    <= 3'd0;endelse beginpre_frame_vsync_d <= {pre_frame_vsync_d[1:0], pre_frame_vsync};pre_frame_hsync_d <= {pre_frame_hsync_d[1:0], pre_frame_hsync};pre_frame_de_d    <= {pre_frame_de_d[1:0]   , pre_frame_de   };end
endassign post_frame_vsync = pre_frame_vsync_d[2]      ;
assign post_frame_hsync = pre_frame_hsync_d[2]      ;
assign post_frame_de    = pre_frame_de_d[2]         ;

将Y分量高5位、高6位、高5位数据作为VGA显示的红、绿、蓝三通道输入数据代码如下所示

assign  vga_rgb = {img_y_w[7:3],img_y_w[7:2],img_y_w[7:3]}   ;

最后通过VGA显示结果如下所示
原图

YCbCr格式图片

RGB---YCbCr图像转换------图像处理相关推荐

  1. MATLAB(完备)之图像.tif到真彩色图像、索引色图像、灰度图像、 真彩色图像RGB、YIQ图像、HSV图像、YCbCr图像转换代码

    I=imread('flower.tif');%读入图片 whos I imfinfo('flower.tif') imshow(I);title('原始tif图像') %%真彩图像.转索图像.灰度图 ...

  2. ffmpeg 保存图片 将rgb数据_FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)...

    FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法. swscale主 ...

  3. 【性能优化】优化笔记之一:图像RGB与YUV转换优化

    本文主要介绍如何优化您自己的CODE,实现软件的加速.我们一个图象模式识别的项目,需要将RGB格式的彩色图像先转换成黑白图像.图像转换的公式如下: Y = 0.299 * R + 0.587 * G ...

  4. 基于FPGA的RGB图像转 Ycbcr图像实现 gray图像

    Ycbcr图像 这里不解释过多,引荐一片论文.参考<基于FPGA的一种色空间转换算法的设计与实现_丁博文>,这篇论文里面讲的很清楚,还有其他的概念和算法的展示. 这里我使用Y分量实现显示的 ...

  5. 图像处理(三)——中国传统工艺画风格的图像转换应用

    中国传统工艺画风格的图像转换应用 1. 项目介绍 希望做一个应用,输入为普通RGB或HSI图像,输出为带有中国特色的蛋壳粘贴画.使用的技术有Matlab.superpixel算法等.          ...

  6. C语言运行时变成灰色,C语言实现RGB图像转换成灰(Gray)度图像

    以前实现RGB图像转换成灰度图像都是直接调用OpenCV的库函数RGB2GRAY(IplImage* src);最近老板让我们除了读入输出图像实时用OpenCV的函数,其余的最好都是自己写,所以我自己 ...

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

    RGB 与 (RGB转 YCbCr再转为 RGB)的图像   不可逆,可以从 矩阵的逆运算看出来. 附上 matlab 代码: clc,clear; Source=imread('1.jpg');%读 ...

  8. [2021 CVPR] 可逆网络实现 RAW 和 RGB 图像转换:Invertible Image Signal Processing

    Invertible Image Signal Processing [pdf] 目录 Abstract Introduction Traditional ISP Analysis Method Ab ...

  9. OpenCV的图像处理——iOS与OpenCV之间图像转换

    前言 1.OpenCV有专门的iOS平台的包,可以真接下载导入工程,也可以用cmake把OpenCV源码编成.a文件,以静态库的形式导入工程. 2.我这里用的Xcode11,OpenCV用的是最4.2 ...

最新文章

  1. python的image读取的图片是什么类型的-opencv python 读取图像/显示图像/保存图像...
  2. 三维点集拟合:平面拟合、RANSAC、ICP算法
  3. HDU - 2444——The Accomodation of Students(判断二分图,二分图最大匹配)
  4. if分支语句(JS)
  5. js 如何在浏览器中获取当前位置的经纬度
  6. tornado autoreload 模式
  7. 用Python爬虫爬取“女神吧”上的照片。
  8. 关于“如何使用FFT计算天线阵列方向图”的学习资料总结
  9. 解决Python爬取百度页面出现中文乱码问题
  10. R语言入门——rep函数
  11. 13.包装类和字符串
  12. 点歌系统源码 android,安卓盒子点歌系统代码
  13. c语言-链表-贪吃蛇
  14. Linux中如何安装特定的gcc版本
  15. PHP导出Excel,亲测有用
  16. EOS测试链加入流程(代码版本与主网同步)
  17. Codeforces711C 【DP】
  18. node-sass安装失败的解决方法
  19. 《程序员十二时辰》,居然是这样的!内容过于真实 ...
  20. 一个拼图软件项目Demo

热门文章

  1. java gui怎么做游戏_Java中关于GUI实现贪吃蛇游戏的简单方法
  2. Oracle 存储过程,Hibernate 调用存储过程,JDBC调用存储过程,Oracle 动态SQL
  3. 机器学习算法-PageRank(排序)
  4. 计算机英语会话实用电脑英语,关于购买电脑的4人英语对话范文
  5. 计算机网络实验室申请报告,实验室经费申请书范文
  6. 浅谈:企业IT信息化的两个阶段
  7. (B站云e办)SpringBoot开发项目实战记录(七)(员工管理(分页知识))
  8. a8 内存 华硕k550d_华硕k550d价格以及相关介绍【图解】
  9. 愁没项目?来看看这些人是怎么赚钱的
  10. php fopen 路径拼接,PHP 拼凑 URL 的问题!