当前位置: 首页 > news >正文

数字图像处理(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. 最终现象如下:

相关文章:

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

&#xff08;1&#xff09;图像平移的基本原理&#xff1a;计算每个像素点的移动向量&#xff0c;并将这些像素按照指定的方向和距离进行移动。 &#xff08;2&#xff09;平移向量包括水平和垂直分量&#xff0c;可以表示为&#xff08;dx&#xff0c;dy&#xff09;&#xff…...

高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?

如果有遗漏,评论区告诉我进行补充 面试官: 什么是类加载器? 我回答: 在Java高级面试中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是一个重要的概念&#xff0c;它涉及到Java类的加载和初始化机制。以下是对类加载器的详细解释&#xff1a; 定义与作用 类加…...

JAVA子类的无参构造器中第一行的super

在 Java 中&#xff0c;子类的构造器是否需要显式调用 super 取决于父类&#xff08;超类&#xff09;的构造器。 如果父类有一个无参构造器&#xff1a; 如果父类有一个无参构造器&#xff0c;那么子类的构造器可以不显式调用 super。在这种情况下&#xff0c;如果子类构造器的…...

mysql程序介绍,选项介绍(常用选项,指定选项的方式,特性),命令介绍(查看,部分命令),从sql文件执行sql语句的两种方法

目录 mysql程序 介绍 选项 介绍 常用选项 指定选项的方式 ​编辑配置文件 环境变量 选项特性 指定选项 选项名 选项值 命令 介绍 查看客户端命令 tee/notee prompt source system help contents 从.sql文件执行sql语句 介绍 方式 source 从外部直接导入…...

Unity教程(十九)战斗系统 受击反馈

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…...

lanqiaoOJ 3744:小蓝的智慧拼图购物 ← pair+优先队列

【题目来源】https://www.lanqiao.cn/problems/3744/learning/【题目描述】 在小蓝的生日那天&#xff0c;他得到了一个由神秘人赠送的拼图游戏&#xff0c;每个拼图都有其特定的价值和相应的优惠券。小蓝决定要买下所有的拼图&#xff0c;但他希望能尽可能地节省花费。小蓝手中…...

Spring Boot教程之二十一:文件处理

Spring Boot – 文件处理 Spring Boot 是一种流行的、基于 Spring 的开源框架&#xff0c;用于开发强大的 Web 应用程序和微服务。由于它建立在 Spring 框架之上&#xff0c;因此它不仅具有 Spring 的所有功能&#xff0c;而且还包括某些特殊功能&#xff0c;例如自动配置、健康…...

【Linux】Linux的基本常识+指令

目录 1. 整体学习思维导图 2. 常见快捷键操作 3. 基本指令 pwd指令 whoami指令 ls 指令 touch指令 cd 指令 Stat 指令 mkdir 指令 alias指令 nano 指令 rmdir 和 rm 指令 man 指令手册 cp 命令 cat/echo/tac 指令 mv 指令 less 指令 head/tail 指令 date…...

Rocky Linux 9.3系统搭建Slurm环境【笔记】

实践环境:Rocky Linux 9.3 [root@m1 ~]# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx) [root@m1 ~]# uname -r 5.14.0-362.8.1.el9_3.x86_64 [root@m1 ~]#主机名和IP ● 控制节点m1:10.1.1.10 ● 计算节点c1:10.1.1.11 ● 计算节点c2:10.1.1.12 一、…...

原生微信小程序使用原子化tailwindcss

这里使用了第三方库来实现:https://weapp-tw.icebreaker.top/ 官方配置步骤一: https://weapp-tw.icebreaker.top/docs/quick-start/native/install 官方配置步骤二:https://weapp-tw.icebreaker.top/docs/quick-start/native/install-plugin 我下面的操作步骤跟官方步骤…...

《掌握Nmap:全面解析网络扫描与安全检测的终极指南》

 nmap # 简介&#xff08;帮助&#xff09; 用法&#xff1a;nmap [扫描类型] [选项] {目标指定内容} 简介&#xff08;帮助&#xff09; 用法&#xff1a;nmap [扫描类型] [选项] {目标指定内容} 一、目标指定&#xff1a; 可以传入主机名、IP 地址、网络等。 例如&a…...

k8s-Informer概要解析(2)

Client-go 主要用在 k8s 控制器中 什么是 k8s Informer Informer 负责与 kubernetes APIServer 进行 Watch 操作&#xff0c;Watch 的资源&#xff0c;可以是 kubernetes 内置资源对象&#xff0c;也可以 CRD。 Informer 是一个带有本地缓存以及索引机制的核心工具包&#x…...

UE5基本数据类型

bool: 表示布尔值&#xff0c;只有两个取值&#xff1a;true 或 false&#xff0c;用于表示逻辑条件。int8: 表示 8 位的有符号整数&#xff0c;范围是 −128−128 到 127127。uint8: 表示 8 位的无符号整数&#xff0c;范围是 00 到 255255。int16: 表示 16 位的有符号整数&am…...

Next.js 系统性教学:中间件与国际化功能深入剖析

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 一、Next.js 中间件 (Middleware) 功能解析 1.1 什么是中间件&#xff1f; 1.2 Next.js 中间件的工作机制 1.3 中间件的功能应用 身份验证与授权 请求重定向 修改请…...

鸿蒙HarmonyOS元服务应用开发实战完全指导

内容提要 元服务概述 元服务开发流程 第一个元服务开发 元服务部署与运行 一、服务概述 1、什么是元服务 在万物互联时代&#xff0c;人均持有设备量不断攀升&#xff0c;设备种类和使用场景更加多样&#xff0c;使得应用开发、应用入口变得更加复杂。在此背景下&#x…...

CT中的2D、MPR、VR渲染、高级临床功能

CT中的2D、MPR、VR渲染 在CT&#xff08;计算机断层扫描&#xff09;中&#xff0c;2D、MPR&#xff08;多平面重建&#xff09;、VR&#xff08;体积渲染&#xff09;是不同的图像显示和处理技术&#xff0c;它们各自有独特的用途和优势。下面分别介绍这三种技术&#xff1a;…...

利用docker-compose来搭建flink集群

1.前期准备 &#xff08;1&#xff09;把docker&#xff0c;docker-compose&#xff0c;kafka集群安装配置好 参考文章&#xff1a; 利用docker搭建kafka集群并且进行相应的实践-CSDN博客 这篇文章里面有另外两篇文章的链接&#xff0c;点进去就能够看到 &#xff08;2&…...

力扣打卡10:K个一组翻转链表

链接&#xff1a;25. K 个一组翻转链表 - 力扣&#xff08;LeetCode&#xff09; 这道题需要在链表上&#xff0c;每k个为一组&#xff0c;翻转&#xff0c;链接。 乍一看好像比较容易&#xff0c;其实有很多细节。比如每一组反转后怎么找到上一组的新尾&#xff0c;怎么找到…...

深度学习详解

深度学习&#xff08;Deep Learning&#xff0c;DL&#xff09;是机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;中的一个子领域&#xff0c;利用多层次&#xff08;深层&#xff09;神经网络来自动从数据中提取特征和规律&#xff0c;模仿人脑的神经系统来进…...

鸿蒙分享(一):添加模块,修改app名称图标

码仓库&#xff1a;https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 新建公共模块common 在entry的oh-package.json5添加dependencies&#xff0c;引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...