基于FPGA的图像灰度处理

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

        对于图像的灰度处理,原理与基于FPGA的图像反转相同,但算法不同。相交于基于FPGA的图像反转,基于FPGA的图像灰度处理操作时间由于FPGA的并行性,其处理时间与前者相同。虽然工作量大了4倍左右,但处理时间基本相同,在仿真中,仍在5.2ms完成了处理。凸显出FPGA图像处理的优势特点。下文将对FPGA图像灰度处理各部分进行讲解。

  • 处理效果

先上处理效果,以下为对我妹妹的脸部进行灰度处理效果。

基于FPGA的图像灰度处理,fpga开发

512*512 处理前            

基于FPGA的图像灰度处理,fpga开发

                                                                512*512 处理后

  • 处理过程

        通过python使用PILLOW,获得输入bmp图片的RGB值,并将R/G/B三个分量分别以16进制写入三个txt文件中。再通过vivado仿真FPGA处理,读取三个txt文件数据分别到三个寄存器中。再从寄存器中读取数据,以verilog语言进行RGB转YCbCr格式处理。在格式转换过程中,同时以两个always模块处理乘、加和一个assig取高8位进行运算。得到YCbCr的Y分量之后,将Y分量输出到一个txt文件中,即为灰度转换的512*512图片的结果。通过python使用OpenCV将txt文件读取,分配到512*512个像素中,即可得到灰度处理后的bmp图像。

        2.1读取lzy.bmp图像,通过配置miniconda环境中的PILLOW库,读取图片RGB数据,分离输出RGB的值到red、green、blue.txt文件。

from PIL import Image

# 打开图像文件
image = Image.open('lzy.bmp')  # 图像文件路径

# 获得图像的 RGB 数据
rgb_values = list(image.getdata())

# 分离 R、G、B 值
r_values = [rgb[0] for rgb in rgb_values]
g_values = [rgb[1] for rgb in rgb_values]
b_values = [rgb[2] for rgb in rgb_values]

# 将 R、G、B 值写入文本文件
with open('red.txt', 'w') as file:
    for value in r_values:
        file.write(format(value, '02X') + '\n')

with open('green.txt', 'w') as file:
    for value in g_values:
        file.write(format(value, '02X') + '\n')

with open('blue.txt', 'w') as file:
    for value in b_values:
        file.write(format(value, '02X') + '\n')

# 关闭图像文件
image.close()

        2.2在vivado中用Verilog语言编写RGB转YCbCr源文件、并编写testbench文件读取数据进行仿真。在源文件中,对于YCbCr格式由于在Verilog语言中,对浮点运算处理较为复杂,所以乘100转为整数数据处理,简化运算。通过Y =(77 *R + 150*G + 29 *B)>>8,进行计算,先进行乘法运算,再进行加法运算,最后取高8位,得到应输出的Y值。

Source:

module rgb_to_ycbcr
(
    input clock,  
    input rst,
    input [7:0] input_red_data,
    input [7:0] input_green_data,
    input [7:0] input_blue_data,

    output [7:0] output_gray_data
);

    reg [15:0] img_red_r0; 
    reg [15:0] img_green_r0; 
    reg [15:0] img_blue_r0; 

always@(posedge clock or negedge rst)
    begin
        if(rst)
            begin
            img_red_r0 <= 0;
            img_green_r0 <= 0;
            img_blue_r0 <= 0;
            end
        else
            begin
            img_red_r0 <= input_red_data * 8'd77;   
            img_green_r0 <= input_green_data * 8'd150;
            img_blue_r0 <= input_blue_data * 8'd29;
        end
    end

reg [15:0] img_Y_r0;

always@(posedge clock or negedge rst)
    begin
        if(rst)
            begin
                img_Y_r0 <= 0;
            end
        else
            begin
                img_Y_r0 <= img_red_r0 + img_green_r0 + img_blue_r0;
            end
    end

assign  output_gray_data = img_Y_r0[15:8];

endmodule

   在testbench仿真文件中,通过分别读取先前输出的red/green/blue.txt文件到,red/green/blue_data寄存器中,设置基本仿真条件,从寄存器输入数据到input_red/green/blue_data中。创建gray.txt文件,将输出结果output_gray_data输入到gray.txt文件中,即可得到灰度处理后的灰度值。

Simulation:

`timescale 1ns/1ps
module rgb_to_ycbcr_tb;
    reg clock;
    reg rst;

    reg [7:0] red_data [(512*512-1):0];
    reg [7:0] green_data [(512*512-1):0];
    reg [7:0] blue_data [(512*512-1):0];

    reg[18:0] cnt;

    integer file_id;

    wire[7:0] input_red_data;
    wire[7:0] input_green_data;    
    wire[7:0] input_blue_data;
    
    wire[7:0] output_gray_data;

    initial begin

        clock = 1'b0;
        forever #10 clock = ~clock;

    end

    initial begin
     cnt = 19'b0;
     $readmemh("./red.txt", red_data);
     $readmemh("./green.txt",green_data);    
     $readmemh("./blue.txt",blue_data);       
     file_id = $fopen("./gray.txt", "w");
    end

    initial begin
     rst = 1'b1;
     #195 rst = 1'b0;
     #20000000 $stop;
     $fclose(file_id);
    end

    assign input_red_data = red_data[cnt[17:0]];
    assign input_green_data = green_data[cnt[17:0]];
    assign input_blue_data = blue_data[cnt[17:0]];

always @(posedge clock or posedge rst)                      
        if (rst) begin                                          /
            cnt <= 19'b0;                                       /
        end                                                     /
        else if(cnt[18] == 1'b0)                                /
        begin                                                   /
            $fwrite(file_id, "0x%x\n", output_gray_data);            /
            cnt <= cnt + 1'b1;                                  /
        end                                                     /

    rgb_to_ycbcr u_rgb_to_ycbcr(
            .clock(clock),
            .rst(rst),
    
            .input_red_data(input_red_data),
            .input_green_data(input_green_data),
            .input_blue_data(input_green_data),
      
            .output_gray_data(output_gray_data)

        );
     
    endmodule

vivado仿真结果如下图:

基于FPGA的图像灰度处理,fpga开发

仿真总图基于FPGA的图像灰度处理,fpga开发

仿真开始阶段图基于FPGA的图像灰度处理,fpga开发

仿真中间部分截取图

        将在python转换得到的三个txt文件,放在工程文件的xsim文件夹里,仿真的结果都输出在了xsim文件夹里的gray.txt。

基于FPGA的图像灰度处理,fpga开发

blue.txt

基于FPGA的图像灰度处理,fpga开发

red.txt

基于FPGA的图像灰度处理,fpga开发

green.txt

基于FPGA的图像灰度处理,fpga开发

gray.txt

        可以看到red/green/blue.txt数据数量均为262136个,输出到gray.txt文件中,数据量也为262136个十六进制数,所有数据都完成了运算,表明仿真成功。

2.3在OpenCV中将输出的txt文件转为bmp图像进行输出。

import cv2
import numpy as np

'''
main entry
'''


def main():
    picture = cv2.imread('./lzy.bmp')
    for i in range(512):
        for j in range(512):
            picture[i, j] = 255

    f = open("./gray.txt", 'r')
    for i in range(512 * 512):
        line = f.readline()
        picture[int(i / 512), int(i % 512)] = int(line, 16)
    f.close()

    cv2.imwrite('./new_lzy.bmp', picture)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

        至此,可以看到在vivado仿真中,与FPGA图像反转处理进行对比,在处理的数据量增加的情况下,处理时间并没有改变,在图像处理中,我们可以广泛应用FPGA的并行特性,实现硬件加速。在仿真中,以20ns一个周期的虚拟时钟进行仿真,处理速度就可以达到5.26ms,如果在FPGA实机中,以更快的时钟速度运行,并且不需要运行仿真文件,直接读取通过存储器传来的数据,速度将可以获得大更大的提高。

        需要工程源码的友友可以在下方评论。

        文章来源地址https://www.toymoban.com/news/detail-763538.html

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

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

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

相关文章

  • 基于FPGA的RGB图像转化为灰度图实现,通过MATLAB进行辅助验证

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 vivado2019.2 matlab2022a         基于FPGA的RGB图像转换为灰度图实现是一种在图像处理领域常见的操作。这种操作通过将彩色图像的RGB三个通道转换为单一的灰度值,使得图像处理

    2024年02月09日
    浏览(29)
  • 基于 FPGA 的彩色图像灰度化的设计实现(image_stitche_x)

    rgb2gray 模块:彩色图像灰度化处理,对串口接收的彩色图像数据实时进行灰度化处理; image_stitche_x 模块:将串口接收的尺寸为 400 480 大小的彩色图像与灰度化处理后的 400 480 大小的图像数据以左右形式合并成一张 800*480 的图像。 提示:以下是本篇文章正文内容,下面案例可

    2024年02月05日
    浏览(35)
  • 基于FPGA的车牌识别,其中包括常规FPGA图像处理算法

    基于FPGA的车牌识别,其中包括常规FPGA图像处理算法:         rgb转yuv,        sobel边缘检测,        腐蚀膨胀,        特征值提取与卷积模板匹配。 有bit流可以直接烧录实验。 保证无错误,完好,2018.3vivado版本,正点达芬奇Pro100t,板卡也可以自己更改移植一下。 所

    2024年04月14日
    浏览(34)
  • 基于FPGA的运动目标检测跟踪系统项目,FPGA项目,FPGA图像处理(已实现)

      1.项目简介 基于FPGA的运动目标检测跟踪系统项目,FPGA项目,FPGA图像处理 FPGA项目 采用帧间差分法作为核心算法,该项目涉及图像采集,颜色空间转换,帧间差分核心算法,腐蚀等形态学处理,目标定位,目标标识,图像显示等模块。 通过该项目可以学习到以下两方面内容

    2024年02月07日
    浏览(32)
  • 基于FPGA的数字图像处理【1.0】

            最近几年图像处理与机器视觉的发展非常迅速,图像处理领域也被认为是未来几十年最有前途的领域之一。         随着现代图像及视频处理技术的不断发展,人们对图像处理提出了新的要求,图像处理系统的硬件体积越来越小,实时性也越来越好。特别是最

    2024年04月14日
    浏览(24)
  • FPGA高端图像处理开发板:鲲叔1号,寄托了未来的一块开发板

    在CSDN写博客传播FPGA开发经验已经一年多了,帮助了不少人,也得罪了不少人,有的人用我的代码赢得了某些比赛、得到了心仪的offer,也有的人天天骂我,anyway,哪怕只要还能帮助一个即将毕业的学生找到工作,哪怕只要还能帮助一个工程师解决项目开发的燃眉之急,我做的

    2024年02月21日
    浏览(25)
  • 基于fpga的图像处理之3x3_5x5算子模板设计

    微信公众号上线,搜索公众号 小灰灰的FPGA ,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 源码工程链接 https://download.csdn.net/download/m0_50111463/88529239 本

    2024年02月05日
    浏览(34)
  • FPGA实战开发-基于DDR的图像缓存(下)

    文章目录 概要 整体架构流程 技术名词解释 技术细节 小结 例如: 基于米联科的学习资料,分享和学习同步,欢迎大家一起探讨。 提示:这里可以添加技术整体架构 例如:       image_data_gen产生了测试图片,之后进入过W0 FIFO进行视频缓存。每次缓存1024个像素,就往通过F

    2024年02月17日
    浏览(26)
  • FPGA实战开发-基于的ddr图像缓存设计(上)

    目录 概要 整体架构流程 技术名词解释 技术细节 ​编辑 小结 提示:这里可以添加技术概要 本文主要基于DDR的图像缓存设计。 提示:这里可以添加技术整体架构 先用图像产生模块产生一个1080P60Hz的测试图像,然后经过FDMA进入ddr3,缓存3帧后在读出来。然后在经过HDMI显示。

    2024年02月08日
    浏览(51)
  • 基于FPGA的运动目标检测跟踪系统项目:从顶层架构设计到RTL编写与仿真,完整实现FPGA图像处理算法实现的项目流程。

    基于FPGA的运动目标检测跟踪系统项目 ,FPGA项目,FPGA图像处理 FPGA项目 采用帧间差分法作为核心算法,该项目涉及图像采集,颜色空间转换,帧间差分核心算法,腐蚀等形态学处理,目标定位,目标标识,图像显示等模块。 通过该项目可以学习到以下两方面内容 1.FPGA顶层架

    2024年04月16日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包