FPGA图像处理-灰度化

这篇具有很好参考价值的文章主要介绍了FPGA图像处理-灰度化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

verilog实现彩色图像的灰度化算法,并进行Modelsim仿真。
图像处理操作中最简单的一类就是点操作,一个像素的输出只取决于输入图像的相应像素值。
RGBGRAY公式:
GRAY = 0.299R + 0.587G + 0.114B
由于FPGA不方便小数运算,所以放大256倍进行运算,然后右移8位:
GRAY = (77R + 150G + 29B) >> 8
彩色图像的灰度化属于点操作,但两级寄存器之间组合逻辑过多会导致时序出问题,所以对该公式进行流水线处理,分为三级流水线:

  • 第一级处理乘法
  • 第二级处理加法
  • 第三级处理移位

模块说明

module rgb2gray(
    input clk,
    input rst_n,
    
    // input data & valid
    input iValid,
    input [7:0] red,
    input [7:0] green,
    input [7:0] blue,

    // output data & valid
    output oValid,
    output [7:0] gray
);

为了简单起见,输入输出都是valid+data的形式

第一级流水线:乘法

// 第一级乘法寄存器
reg [15:0] red_r;
reg [15:0] green_r;
reg [15:0] blue_r;

always @(posedge clk, negedge rst_n) begin
    if(!rst_n) begin
        red_r   <= 0;
        green_r <= 0;
        blue_r  <= 0;
    end else begin
        red_r   <= red * 8'd77;
        green_r <= green * 8'd150;
        blue_r  <= blue * 8'd29;
    end
end

第二级流水线:加法

// 第二级加法寄存器
reg [15:0] gray_r1;

always @(posedge clk, negedge rst_n) begin
    if(!rst_n)
        gray_r1 <= 0;
    else
        gray_r1 <= red_r + green_r + blue_r;
end

第三级流水线:移位

// 第三级移位寄存器
reg [7:0] gray_r2;

always @(posedge clk, negedge rst_n) begin
    if(!rst_n)
        gray_r2 <= 0;
    else
        gray_r2 <= gray_r1[15:8];
end

assign gray = gray_r2;

valid延迟输出

因为流水线消耗了3个时钟周期,所以输出valid相较于输入valid要延迟3

// valid打三拍
reg [2:0] valid_shift;

always @(posedge clk, negedge rst_n) begin
    if(!rst_n)
        valid_shift <= 0;
    else
        valid_shift <= {valid_shift[1:0], iValid};
end

assign oValid = valid_shift[2];

Modelsim仿真

写个testbench模拟50个像素输入:

`timescale 1ns/1ns
module rgb2gray_tb;
    reg clk = 1'b1;
    always #10 clk = ~clk;
    reg rst_n = 1'b0;

    reg         iValid = 1'b0;
    reg [7:0]   red    = 8'd0;
    reg [7:0]   green  = 8'd0;
    reg [7:0]   blue   = 8'd0;

    // 用于对比
    wire [7:0] gray_ref = red * 0.299 + green * 0.587 + blue * 0.114;

    wire            oValid;
    wire    [7:0]   gray;

    initial begin
        #20 rst_n <= 1'b1;
        // 仿真50个像素
        repeat(50) begin
            #20;
            iValid <= 1'b1;
            red    <= $random;
            green  <= $random;
            blue   <= $random;
        end
        #100 $stop;
    end

    rgb2gray inst_rgb2gray(
        .clk    (clk),
        .rst_n  (rst_n),
        .iValid (iValid),
        .red    (red),
        .green  (green),
        .blue   (blue),
        .oValid (oValid),
        .gray   (gray)
    );
endmodule

波形图如下:
FPGA图像处理-灰度化
图中gray_ref是参考答案,可以看出,graygray_ref慢三个时钟周期,因为模块内部有三级流水线。
输出与参考答案偶尔有误差,那是因为FPGA中没有进行浮点数运算,将小数放大了256倍,然后取整用于运算,最后再缩小256倍,肯定是有误差的,不过影响不大,可以忽略。文章来源地址https://www.toymoban.com/news/detail-469383.html

到了这里,关于FPGA图像处理-灰度化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像处理(1):用Python实现彩色图像转为灰度图像的两种方法以及批量将图片转为灰度图

    用Python实现彩色图像转为灰度图像的两种方法介绍 这篇文章给大家主要介绍使用 Python 将彩色图像转为灰度图像的两种方法,以及用 Python 批量将图片转为灰度图的方法,供大家参考: 使用Python中的cv2库,它自带彩色转灰度的方法,并且代码非常简单。 先读取一张彩色图片,然

    2024年02月11日
    浏览(50)
  • 图像处理之图像灰度化

    图像灰度化 彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万 (255 255 255)的颜色的变化范用。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像(R=G=B),其一个像素点的变化范围为255种,所以在数字图像处理

    2024年02月15日
    浏览(41)
  • OpenCV图像处理-灰度处理

    灰度的线性变换将图像中的所有像素点的值按 线性变换函数 进行变换。 在曝光不足或过度的情况下,图像的灰度值会局限在一个很小的范围内,这时在显示器上看到的将是一个模糊不清、似乎没有层次的图像。 针对这一情况,使用一个线性单值函数对图像内的每一个像素做

    2024年02月08日
    浏览(106)
  • 计算机视觉学习笔记(图像的灰度与灰度级 图像的深度 图像噪声 图像处理)

    如果把白色和黑色之间按对数关系分为若干等级,称为灰度,灰度分为256阶,0为黑色,灰度就是没有色彩,RGB色彩分量全部相等(150,150,150)就代表灰度为150. 一幅图像中不同位置的亮度是不一样的,可用f(x,y)来表示(x,y)上的亮度。由于光是一种能量形式,因此亮度是非负

    2024年02月01日
    浏览(61)
  • opencv 图像基础处理_灰度图像

    二值图像表示起来简单方便,但是因为其仅有黑白两种颜色,所表示的图像不够细腻。如果想要表现更多的细节,就需要使用更多的颜色。例如,图 2-3 中的 lena 图像是一幅灰度图像, 它采用了更多的数值以体现不同的颜色,因此该图像的细节信息更丰富。 通常,计算机会将

    2024年02月15日
    浏览(57)
  • 图像处理(二值图、灰度图、彩色图像)

    图像处理之二值图像、灰度图像、RGB图像 1、二值图像 定义:二值图像是值仅仅包含黑色和白色的图像 计算机在处理时,会把黑色像素点处理为0,白色像素点处理1。由于只用一个比特位就能表示,所以称之为二值图像。 2、灰度图 为了表达更丰富的颜色细节,灰度图采用更

    2024年02月06日
    浏览(61)
  • 图像预处理算法————灰度化处理

    图像预处理算法适合在FPGA上完成,原理简单且需要快速处理,通常有灰度化、中值、均值滤波等,以及颜色空间转换算法。 灰度图像是一种特殊的彩色图像(R=G=B的彩色图像) 只有一种颜色分量,单通道的0-255 方法:一般有分量法、最大值法、平均值法、加权平均法四种方

    2024年01月17日
    浏览(51)
  • matlab数字图像处理——图像的读写,灰度、二值图像

    一、实验目的 1.结合数字图像处理的知识,直观感受图像处理的基本实现过程 2.熟悉MATLAB工具的使用 3.了解图像的读写和显示 二、实验内容 实验内容一:图像读取 (1)利用编程实现读取图像 利用imread读取文件夹images中的图像;查看读取到的图像数据矩阵,对比灰度图像、

    2024年02月07日
    浏览(58)
  • python 图像处理之图像灰度化 cvtColor

    预备知识 图像灰度化是将一幅彩色图像转换为灰度化图像的过程。 彩色图像的色彩通常由R、G、B三个分量组合而成(其实就是3个二维数组叠加而成),从而搭配出各种颜色 灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度,灰度值大的像素

    2024年02月03日
    浏览(53)
  • Opencv 图像处理:图像基础操作与灰度转化

    本文已收录于Opencv系列专栏: 深入浅出OpenCV ,专栏旨在详解Python版本的Opencv,为计算机视觉的开发与研究打下坚实基础。免费订阅,持续更新。 1.图像格式 图像压缩比: 通过编码器压缩后的图象数字大小和原图象数字大小的压缩比。 BMP 格式 Windows系统下的 标准位图格式 ,

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包