FPGA图像处理——YCbCr灰度转换

2023-11-14

之前的单通道灰度转换作为一个图像处理FPGA框架搭建完成后的一个简单效果的测试,其图像的层次感有待提高,图像处理灰度转换用的更多的还是YCbCr。
一、YCbCr
YCbCr或Y’CbCr有的时候会被写作:YCBCR或是Y’CBCR,Y’为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份。Y就是所谓的亮度(luminance),表示光的浓度且为非线性,使用伽马修正(gamma correction)编码处理。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化,因此后面的图像处理使用灰度图像都是基于Y分量图像。以后这个YCbCr工程将被作为图像处理的模板。
RGB转YCbCr:
请添加图片描述
二、MATLAB图像处理
代码:
请添加图片描述
效果图:
请添加图片描述
这张图目测Y分量和G分量差别不大,理论上Y分量图像的层次感是最好的,在其他更加精致的图像上能比较明显的观察到,但由于我比较喜欢这张图,就放这张图的效果图好了。
三、FPGA实现
工程设计图和上一个单通道是一致的,都是简单的图像变换,时序上只要求信号同步。将上个单通道输出部分重新编写即可。
1.由于FPGA无法进行浮点数运算,需要将浮点数进行转换。
请添加图片描述
将浮点数乘以256后,向右移位8位(相当于除以256),再把123写进括号即为YCbCr最终的Verilog表达式。
2.RGB转YCbCr
(1)接收数据,有tft传过来的数据为RGB565,通过低位补零转为RGB888

                                           //组合逻辑无时延
	assign R0 = {TFT_rgb[15:11],3'd0};
	assign G0 = {TFT_rgb[10:5],2'd0};
	assign B0 = {TFT_rgb[4:0],3'd0};

(2)首先进行上述运算的第一步,乘法运算256对应系数

													//时序逻辑,延时clk1
	always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n) begin
		  {R1,G1,B1} <= {16'd0, 16'd0, 16'd0};
        {R2,G2,B2} <= {16'd0, 16'd0, 16'd0};
        {R3,G3,B3} <= {16'd0, 16'd0, 16'd0};
		end
		else begin
			{R1,G1,B1} <= {{R0 * 16'd77},  {G0 * 16'd150}, {B0 * 16'd29 }};    //Y   =   0.299*R + 0.587*G + 0.114*B
			{R2,G2,B2} <= {{R0 * 16'd43},  {G0 * 16'd85},  {B0 * 16'd128}};    //Cb  =   0.586*(B-Y) + 128 = -0.172*R - 0.339*G + 0.511*B + 128
			{R3,G3,B3} <= {{R0 * 16'd128}, {G0 * 16'd107}, {B0 * 16'd21 }};		//Cr  =   0.713*(R-Y) + 128 =  0.511*R - 0.428*G - 0.083*B + 128	
		end
	end

(3)把YCbCr常数项128加入

									//第二次延时clk1
	always @(posedge clk or negedge rst_n) 
	begin
		 if(!rst_n)begin
			  Y1  <= 16'd0;
			  Cb1 <= 16'd0;
			  Cr1 <= 16'd0;
		 end
		 else begin
			  Y1  <= R1 + G1 + B1;                          //        Y   =   ( 77*R  +  150*G  +   29*B) >> 8
			  Cb1 <= B2 - R2 - G2 + 16'd32768; //128扩大256倍//        Cb  =   (-43*R  -   85*G  +  128*B + 32768) >> 8
			  Cr1 <= R3 - G3 - B3 + 16'd32768; //128扩大256倍//        Cr  =   (128*R  -  107*G  -   21*B + 32768) >> 8
		 end
	end

(4)除以256即右移8位,即用一个8位数取16位数据的高8位

                                                                    //第三次延时clk1	
	always @(posedge clk or negedge rst_n) 
	begin
		 if(!rst_n)begin
			  Y_out  <= 8'd0;
			  Cb_out <= 8'd0;
			  Cr_out <= 8'd0;
		 end
		 else begin
			  Y_out  <= Y1[15:8];  
			  Cb_out <= Cb1[15:8];
			  Cr_out <= Cr1[15:8];
		 end
	end	

(5)到此处,YCbCr格式数据得到了,只用Y分量,取Y分量的高位565值,最终输出ycbcr_rgb

assign 	ycbcr_rgb = {Y_out[7:3],Y_out[7:2],Y_out[7:3]};

到这里,到这里对于信号ycbcr已经得到,中间三个时序变化,延时3个clk,控制信号也要同步
(6)把控制信号进行同步(手法!!!!!)

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
       TFT_de_r  <= 3'b0;
       TFT_hs_r  <= 3'b0;
       TFT_vs_r  <= 3'b0;
		 TFT_pwm_r <= 3'b0;
       TFT_begin_r <= 3'b0;
		 TFT_clk_r   <= 3'b0;
	 end
    else begin  
     TFT_de_r <= {TFT_de_r[1:0], TFT_de};          //延时一个时钟_ _ de  延时两个时钟_ de de 延时三个时钟de de de
     TFT_hs_r <= {TFT_hs_r[1:0], TFT_hs};
     TFT_vs_r <= {TFT_vs_r[1:0], TFT_vs};
	  TFT_pwm_r <= {TFT_pwm_r[1:0], TFT_pwm};          //延时一个时钟_ _ de  延时两个时钟_ de de 延时三个时钟de de de
     TFT_begin_r <= {TFT_begin_r[1:0], TFT_begin};
     TFT_clk_r <= {TFT_clk_r[1:0], TFT_clk};
	  
    end
end
//取最高位,即完成控制信号的同步延时三个clk时钟
	assign ycbcr_de = TFT_de_r[2];
	assign ycbcr_hs = TFT_hs_r[2];
	assign ycbcr_vs = TFT_vs_r[2];	
	assign ycbcr_pwm = TFT_pwm_r[2];
	assign ycbcr_begin = TFT_begin_r[2];
	assign ycbcr_clk = TFT_clk_r[2];

3.rtl视图
请添加图片描述
4.开发板验证图
请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA图像处理——YCbCr灰度转换 的相关文章

  • JAVA简介

    JAVA简介 java是一种高级的面向对象的程序设计语言 使用java编写的的程序可以在任何计算机 操作系统和支持java的硬件设备上运行 什么是java java语言的发展历程 Java是于1995年由Sun公司推出的一种极富创造力的面向
  • 手撸算法-计算表达式

    牛客原题 描述 请写一个整数计算器 支持加减乘三种运算和括号 示例1 输入 1 2 返回值 3 示例2 输入 2 3 4 5 返回值 10 示例3 输入 3 2 3 4 1 返回值 26 思路 从左向右遍历字符串 1 遇到数字则入栈 注意数
  • C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子 是参考这个地址 http www cnblogs com longwu archive 2011 08 25 2153636 html 进行了一些异常处理 提示信息的补充 还有新增获取本地IP
  • 【docker】docker 实现 的基础

    1 概述 还不懂Docker 一个故事安排的明明白白
  • 大数相加(c++)算法

    有没有想过100位数加100数的数字该如何计算出结果吗 一般计算机是无法直接计算那么大的数字 这个时候我们得模拟我们手算加法的进制过程 如何用代码把它实现 这样子就能实现大数相加了 首先我很感谢汤健同学给我分享的这串代码 我写笔记的初衷是为

随机推荐

  • R 中的with() 函数和 by()函数 的简单使用

    with data expr 函数用于在一个从data构建出的环境中运行R表达式 by data INDICES FUN simplify TRUE 函数用于将data中的数据 按照INDICES里面的内容拆分成若干个小的data fram
  • 提高ubuntu下访问github的速度\加速git clone速度

    这个是真的有用 https blog csdn net hn tzy article details 88903642
  • 实战中的 Promise 和 Future

    上一章介绍了 Future 类型 以及如何用它来编写高可读性 高组合性的异步执行代码 Future 只是整个谜团的一部分 它是一个只读类型 允许你使用它计算得到的值 或者处理计算中出现的错误 但是在这之前 必须得有一种方法把这个值放进去 这
  • Python正则表达式re模块学习遇到的问题

    Python正则表达式处理的组是什么 Python正则表达式处理中的匹配对象是什么 Python匹配对象的groups groupdict和group之间的关系 Python正则表达式re match r a1b2c3 匹配结果为什么是 c
  • Swiper、vue-awesome-swiper 插件使用

    Swiper在PC端和移动端都适用 官方网站 Swiper中文网首页 官方 vue2 配合 swiper5或6版本 vue3 可以使用 swiper8最新版本 一 Swiper插件 Vue React Angular框架都可以使用 1 使用
  • 【计算机组成原理】实验4:存储器读写实验

    实验内容 一 实验原理 存储器是计算机的存储部件 用于存放程序和数据 存储器是计算机信息存储的核心 是计算机必不可少的部件之一 计算机就是按存放在存储器中的程序自动有序不间断地进行工作 本系统从提高存储器存储信息效率的角度设计数据通路 按现
  • wms系统与物联网发展趋势密切相关

    物联网 简称IoT 是指通过各种信息传感器 射频识别技术 全球定位系统 红外感应器 激光扫描器等各种装置与技术 实时采集任何需要监控 连接 互动的物体或过程 采集其声 光 热 电 力学 化学 生物 位置等各种需要的信息 通过各类可能的网络接
  • 海德拉 暴力破解ssh密码

    上一篇博客写到怎么有效地防护ssh密码遭到暴力破解 今天给大家介绍下如何暴力破解ssh密码 作为一名云计算工程师 懂得如何防护比如何攻击更重要 hydra是世界顶级密码破解工具 支持几乎所有协议的在线密码破解 密码能否被破解取决于密码字典是
  • 华为OD机试真题-优雅子数组Python实现【2023.Q1】

    题目内容 如果一个数组中出现次数最多的元素出现大于等于K次 被称为K 优雅数组 k也可以被称为优雅阈值 例如 数组1 2 3 1 2 3 1 它是一个3 优雅数组 因为元素1出现次数大于等于3次 数组1 2 3 1 2就不是一个3 优雅数组
  • MySQL 日期格式化

    本文旨在以最快的速度 提供你需要的 MySQL 日期格式化方案 1 将时间格式化为 YYYY mm dd HH ii ss 格式 我想你要搜的就是这个 哈哈哈 SELECT DATE FORMAT NOW Y m d H i s 效果如图
  • python中dump与dumps的区别

    Python3 JSON模块的使用 参考链接 https docs python org 3 library json html 这里只是介绍最常用的dump dumps和load loads import json 自定义了一个简单的数据
  • flume使用(二):采集远程日志数据到MySql数据库

    本文内容可查看目录 本文内容包含单节点 单agent 和多节点 多agent 采集远程日志 说明 一 环境 linux系统 Centos7 Jdk 1 7 Flume 1 7 0 二 安装 linux中jdk mysql的安装不多赘述 fl
  • Redis清除缓存命令

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 方案1 windows操作系统 进入redis的安装目录 双击redis cli exe 执行 dbsize 执行 flushall 退出 方案2 linux操作系统 进入
  • vue-quill-editor富文本编辑器使用及配置更改

    quill editor支持了常用的功能 但是有2点 需要我们自己定制一下 vue集成quill editor很简单 网上有很多介绍 自行百度下即可 1 图片上传 因为编辑器默认是将图片转成base64存储的 而我们实际开发需要将图片存在自
  • 怎么给PDF签名?来看看这几个方法吧

    年关将至 这几天我所在的部门每个人都很忙碌 都在对今天年尾的申报文件以及明年的商家合同进行处理 今天 领导让我将几份商家合同扫描成PDF电子版本 同时将负责人签名导入文件中 不过由于我之前只接触过扫描文档 并不会在电子文件上导入签名 于是我
  • 终于搞懂了 @Configuration 和 @Component 的区别

    一句话概括就是 Configuration 中所有带 Bean 注解的方法都会被动态代理 因此调用该方法返回的都是同一个实例 理解 调用 Configuration类中的 Bean注解的方法 返回的是同一个示例 而调用 Component类
  • 寓教于乐——PyGame游戏编程,Python小游戏制作实战教学

    Python非常受欢迎的一个原因是它的应用领域非常广泛 其中就包括游戏开发 而是用Python进行游戏开发的首选模块就是PyGame 1 初识Pygame PyGame是跨平台Python模块 专为电子游戏设计 包含图像 声音等 创建在SD
  • javaScript 实现冒泡排序与快速排序

    javaScript 实现冒泡排序与快速排序 下面代码是否正确 有没有大神帮忙看下 谢谢
  • Pandas数据处理(续)/数据聚合[groupby+sum,mean/apply/transform]

    5 数据聚合 重点 数据聚合是数据处理的最后一步 通常是要使每一个数组生成一个单一的数值 数据分类处理 分组 先把数据分为几组 用函数处理 为不同组的数据应用不同的函数以转换数据 合并 把不同组得到的结果合并起来 数据分类处理的核心 gro
  • FPGA图像处理——YCbCr灰度转换

    之前的单通道灰度转换作为一个图像处理FPGA框架搭建完成后的一个简单效果的测试 其图像的层次感有待提高 图像处理灰度转换用的更多的还是YCbCr 一 YCbCr YCbCr或Y CbCr有的时候会被写作 YCBCR或是Y CBCR Y 为颜