数字图像处理(15):图像平移

        (1)图像平移的基本原理:计算每个像素点的移动向量,并将这些像素按照指定的方向和距离进行移动。

        (2)平移向量包括水平和垂直分量,可以表示为(dx,dy),其中dx表示水平方向上的移动距离,dy表示垂直方向上的移动距离。

        (3)经过平移后,新图像中的每个像素点在原图像中都有对应的像素点。图像平移使用软件开发语言实现很容易,但在FGPA中实现需要考虑缓存。

        (4)matlab实现代码:

% 读取图像
% imread函数用于读取图像文件,支持多种格式如BMP、PNG、JPG等
img = imread('1_1920x1080.bmp');% 获取图像尺寸信息
% size函数返回矩阵的维度,对于彩色图像返回[高度 宽度 通道数]
[rows, cols, channels] = size(img);% 创建仿射变换矩阵
% 这里创建的是一个2x3的变换矩阵,用于定义图像的变换方式
% [1 0 300;   - 第一行表示x方向的变换:x'= 1*x + 0*y + 300
%  0 1 200]    - 第二行表示y方向的变换:y'= 0*x + 1*y + 200
% 这个矩阵表示将图像向右平移300像素,向下平移200像素
M = single([1, 0, 300; 0, 1, 200]);% 执行仿射变换
% affine2d函数用于创建二维仿射变换对象
tform = affine2d(M');  % 注意MATLAB中需要转置变换矩阵
% imwarp函数执行图像变换
% OutputView选项指定输出图像的大小,这里保持与原图相同
res = imwarp(img, tform, 'OutputView', imref2d([rows cols]));% 保存变换后的图像
% imwrite函数将图像保存到文件
% 第一个参数是图像数据,第二个参数是文件名
imwrite(res, 'result.bmp');% 显示结果图像
% figure创建新的图形窗口
figure;
% subplot用于创建子图,这里创建1x2的子图布局
subplot(1,2,1);
imshow(img);  % 显示原图
title('原始图像');
subplot(1,2,2);
imshow(res);  % 显示变换后的图像
title('变换后的图像');

        (5)FPGA仿真实现:

module move
(input   wire            clk         ,input   wire            reset_n     ,input   wire    [10:0]  img_width   ,input   wire    [10:0]  img_height  ,input   wire    [10:0]  img_x_start ,input   wire    [10:0]  img_y_start ,input   wire    [23:0]  img_data_i  ,output  wire            wr_ready    ,output  reg             valid_o     ,output  reg     [23:0]  img_data_o);reg [11:0]  h_cnt,v_cnt;always@(posedge clk or negedge reset_n)if(!reset_n)h_cnt <= 12'd0;else if(h_cnt == img_x_start + img_width - 1)h_cnt <= 12'd0;else h_cnt <= h_cnt + 12'd1;always@(posedge clk or negedge reset_n)if(!reset_n) v_cnt <= 12'd0;else if((v_cnt == img_y_start + img_height - 1) && (h_cnt == img_x_start + img_width - 1))v_cnt <= 12'd0;else if(h_cnt == img_x_start + img_width - 1)v_cnt <= v_cnt + 12'd1;else v_cnt <= v_cnt;assign wr_ready = (h_cnt >= img_x_start) && (v_cnt >= img_y_start);always@(posedge clk or negedge reset_n)if(!reset_n)valid_o <= 1'd0;else if((h_cnt < img_width) && (v_cnt < img_height))valid_o <= 1'd1;else valid_o <= 1'd0;always@(posedge clk or negedge reset_n)if(!reset_n)img_data_o <= 24'd0;else if((h_cnt < img_width) && (v_cnt < img_height) && (wr_ready))img_data_o <= img_data_i;else img_data_o <= 24'd0;endmodule

        微调读写测试文件后,仿真出来的图像(与matlab仿真结果一致):

        (6)FPGA实现

  • 查看配置进程:report_property -all [get_runs impl_1]
  1. 写入DDR3部分不需要修改,可以沿用,但是读取部分需要修改,首先是结束地址,需要适配新的y轴偏移量
    axi_ddr3_top    axi_ddr3_top_inst
    (.ddr3_clk            (clk_320M              ),.reset_n             (rst_n                 ),.pingpang            (1'd0                  ),.ui_clk              (ui_clk                ),.ui_rst              (ui_rst                ),.wr_b_addr           (32'd0                 ),.wr_e_addr           (IMG_LENGTH*IMG_WIDE*4 ),.wr_clk              (clk                   ),.data_wren           (data_wren             ),.data_wr             (data_wr               ),.wr_rst              (1'd0                  ),.rd_b_addr           (32'd0                 ),.rd_e_addr           (IMG_LENGTH*(IMG_WIDE-Y_OFFSET+1)*4 ),.rd_clk              (clk_vga_2             ),.data_rden           (lie >= Y_OFFSET       ),.data_rd             (data_rd               ),.rd_rst              (1'd0                  ),.read_enable         (1'd1                  ),.rd_data_valid       (),.ddr3_addr           (ddr3_addr             ),.ddr3_ba             (ddr3_ba               ),.ddr3_cas_n          (ddr3_cas_n            ),.ddr3_ck_n           (ddr3_ck_n             ),.ddr3_ck_p           (ddr3_ck_p             ),.ddr3_cke            (ddr3_cke              ),.ddr3_ras_n          (ddr3_ras_n            ),.ddr3_reset_n        (ddr3_reset_n          ),.ddr3_we_n           (ddr3_we_n             ),.ddr3_dq             (ddr3_dq               ),.ddr3_dqs_n          (ddr3_dqs_n            ),.ddr3_dqs_p          (ddr3_dqs_p            ),.init_calib_complete (init_calib_complete   ),.ddr3_cs_n           (ddr3_cs_n             ),.ddr3_dm             (ddr3_dm               ),.ddr3_odt            (ddr3_odt              )  
    );
  2. 缓存行数据,使用一个24位,深度位2048的双口RAM去存储从DDR3中读出来的数据,然后在VGA模块扫描到对应位置时输出,即可。

    hang_ram_2048  hang_ram_2048_inst 
    (.clka       (clk_vga_2                  ), .ena        (1'd1                       ), .wea        (lie >= Y_OFFSET && reading ), .addra      (buf_wr_addr                ), .dina       (line_buffer                ), .clkb       (clk_vga                    ), .enb        (hang >= X_OFFSET           ), .addrb      (buf_rd_addr                ), .doutb      (ram_dout                   )  
    );always @(posedge clk_vga_2 or negedge init_rst_n) beginif(!init_rst_n) beginlast_data_rd <= 16'd0;buf_wr_addr <= 11'd0;reading <= 1'b0;line_buffer <= 24'd0;endelse beginif(lie >= Y_OFFSET) beginif(!reading) begin  // 第一次读取last_data_rd <= data_rd;reading <= 1'b1;endelse begin  // 第二次读取line_buffer <= {last_data_rd, data_rd[15:8]};buf_wr_addr <= buf_wr_addr + 11'd1;reading <= 1'b0;endendelse beginbuf_wr_addr <= 11'd0;reading <= 1'd0;endend
    end// 行缓存读取控制,在这里实现偏移
    always @(posedge clk_vga or negedge init_rst_n) beginif(!init_rst_n) buf_rd_addr <= 11'd0;else beginif(display_valid)buf_rd_addr <= buf_rd_addr + 1'd1;else buf_rd_addr <= 11'd0;end
    endassign display_valid = (hang >= X_OFFSET)&&(lie >= Y_OFFSET);  
  3. 最终现象如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外的bug-hunters,不一样的403bypass

一种绕过403的新技术&#xff0c;跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 &#xff08;访问fsip.svc为403&#xff09; 在经过尝试后&#xff0…

WPF Prism 01-BootstrapperShell

Prism介绍 Prism 是一个用于在 WPF、.NET MAUI、Uno 平台和 Xamarin Forms 中构建松耦合、可维护和可测试的 XAML 应用程序的框架。每个平台都有单独的发布版本&#xff0c;并且这些版本将在独立的开发时间线上进行开发。Prism 提供了一组设计模式的实现&#xff0c;这些模式有…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

Sketch中文版下载安装:一站式设计平台指南

Sketch&#xff0c;这个以轻量和高效著称的矢量设计工具&#xff0c;已经在全球设计领域创造了许多令人惊叹的成果。它以其矢量编辑、控件和样式等功能而闻名。而其中文版本——一站式设计平台“在线设计工具”&#xff0c;在功能全面性、中文操作环境、简洁界面以及设备兼容性…

机器学习决策树原理详解

一、引言 在当今蓬勃发展的人工智能与大数据领域&#xff0c;大模型正以前所未有的影响力改变着众多行业的格局。而决策树作为机器学习算法家族中的经典成员&#xff0c;以其简洁直观的特点和广泛的适用性&#xff0c;不仅能独立解决诸多实际问题&#xff0c;更是诸多先进大模…

Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例

1、在pom.xml中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><version>3.1.6</version></dependency> 2、配置application.yml 加入Kafk…

物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉

0. 要实现的效果 让树莓派可以识别身边的一些物品&#xff0c;比如电脑&#xff0c;鼠标&#xff0c;键盘&#xff0c;杯子&#xff0c;行李箱&#xff0c;双肩包&#xff0c;床&#xff0c;椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…

大数据-245 离线数仓 - 电商分析 缓慢变化维 与 拉链表 SCD Slowly Changing Dimensions

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

【LeetCode: 160. 相交链表 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

从爱尔兰歌曲到莎士比亚:LSTM文本生成模型的优化之旅

上一篇&#xff1a;《再用RNN神经网络架构设计生成式语言模型》 序言&#xff1a;本文探讨了如何通过多种方法改进模型的输出&#xff0c;包括扩展数据集、调整模型架构、优化训练数据的窗口设置&#xff0c;以及采用字符级编码。这些方法旨在提高生成文本的准确性和合理性&am…

51c大模型~合集86

我自己的原文哦~ https://blog.51cto.com/whaosoft/12772867 #MILP-StuDio 拆解高复杂运筹问题的砖石&#xff0c;打破数据稀缺的瓶颈&#xff0c;中科大提出高质量运筹数据生成方法 论文作者刘昊洋是中国科学技术大学 2023 级硕士生&#xff0c;师从王杰教授&#xff0c;…

从零用java实现 小红书 springboot vue uniapp (1)

前言 偶尔会用小红书发一些笔记 闲来无事 想自己实现一个小红书 正好可以学习一下 帖子 留言 im 好友 推送 等功能 下面我们就从零 开发一个小红书 后台依旧用我们的会员系统的脚手架 演示 http://120.26.95.195:8889/ 客户端我们使用uniapp 我们首先对主页进行一个分解 顶部我…

pyside6学习专栏(一)常用控件的使用(非QML方式)

前段业余时间在用pythonpyqt5边学边作一些小程序&#xff0c;总算作到了一个相对复杂的基本VTK三维显示地形图并计算挖填方工程量&#xff0c;作完后&#xff0c;又发现pyqt又是要收费的&#xff0c;就又看了下对应的替代库pyside6,对用此库的一些基本技能分享到此专栏中&#…

活动|华院计算董事长宣晓华应邀出席2024科创大会并作圆桌嘉宾

2024科创大会在上海举行&#xff0c;由中央广播电视总台和上海市人民政府共同主办。本次大会以“创新驱动 新质未来”为主题&#xff0c;来自知名院校、科研机构的专家学者以及科技企业、金融机构的相关负责人共聚一堂&#xff0c;探讨人工智能、生物医药等产业应用前景&#x…

计算机网络-IPSec VPN工作原理

一、IPSec VPN工作原理 昨天我们大致了解了IPSec是什么&#xff0c;今天来学习下它的工作原理。 IPsec的基本工作流程如下&#xff1a; 通过IKE协商第一阶段协商出IKE SA。 使用IKE SA加密IKE协商第二阶段的报文&#xff0c;即IPsec SA。 使用IPsec SA加密数据。 IPsec基本工作…

leetcode 3001. 捕获黑皇后需要的最少移动次数 中等

现有一个下标从 1 开始的 8 x 8 棋盘&#xff0c;上面有 3 枚棋子。 给你 6 个整数 a 、b 、c 、d 、e 和 f &#xff0c;其中&#xff1a; (a, b) 表示白色车的位置。(c, d) 表示白色象的位置。(e, f) 表示黑皇后的位置。 假定你只能移动白色棋子&#xff0c;返回捕获黑皇后…

linux 系统常用指令

1、查看内核版本 uname -r 2、列出占用空间最大的 10 个文件或目录 du -ah / | sort -rh | head -n 10 终于找到我虚拟机硬盘空间越来越少的原因了&#xff0c;类目......

【OpenDRIVE_Python】使用python脚本更新OpenDRIVE数据中路口Junction名称

示例代码说明&#xff1a; 遍历OpenDRIVE数据中每个路口JunctionID,读取需要变更的路口ID和路口名称的TXT文件,若JunctionID与TXT文件中的ID一致&#xff0c;则将TXT对应的点位名称更新到OpenDRIVE数据中Junction name字段。补充&#xff1a;需要保持TXT和OpenDRIVE数据文件编…

PySpark3.4.4_基于StreamingContext实现网络字节流统计分析

网络字节流与嵌套字节流的区别 概念解释 网络嵌套字节流&#xff1a; 在网络编程的情境下&#xff0c;网络嵌套字节流通常是指将字节流&#xff08;字节序列&#xff09;以一种分层或者包含的方式进行组织&#xff0c;用于在网络传输过程中更好地处理数据。例如&#xff0c;在一…

【JS】简单CSS简单JS写的上传进度条

纯JS写的&#xff0c;简单的上传进度条&#xff0c;当上传的文件较大&#xff0c;加一个动态画面&#xff0c;就不会让人觉得出错了或网络卡了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"v…