Python与FPGA——膨胀腐蚀

文章目录

  • 前言
  • 一、膨胀腐蚀
  • 二、Python实现腐蚀算法
  • 三、Python实现膨胀算法
  • 四、Python实现阈值算法
  • 五、FPGA实现腐蚀算法
  • 总结


前言

  腐蚀是指周围的介质作用下产生损耗与破坏的过程,如生锈、腐烂等。而腐蚀算法也类似一种能够产生损坏,抹去部分像素的算法。


一、膨胀腐蚀

  膨胀腐蚀之前需要对图像进行二值化处理,然后进行以下处理。

  腐蚀: P = P 1 & P 2 & P 3 & P 4 & P 5 & P 6 & P 7 & P 8 & P 9 P = P1 \& P2 \& P3 \& P4 \& P5 \& P6 \& P7 \& P8 \& P9 P=P1&P2&P3&P4&P5&P6&P7&P8&P9
  膨胀: P = P 1 ∣ P 2 ∣ P 3 ∣ P 4 ∣ P 5 ∣ P 6 ∣ P 7 ∣ P 8 ∣ P 9 P = P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 P=P1∣P2∣P3∣P4∣P5∣P6∣P7∣P8∣P9
  图像二值化如下。

import numpy as np
import matplotlib.pyplot as plt
img = plt.imread("lenna.png")
gray = 0.299 * img[:, :, 0] + 0.587 * img[:, :, 1] + 0.114 * img[:, :, 2] 
gray = gray * 255#图像是[0-1]--->[0-255]
bin_image = np.where(gray >= 128, 1, 0)#处理成[0,1]像素

二、Python实现腐蚀算法

def bin_erosion(binary, n):h, w = gray.shapem = int((n - 1) / 2)erosion_image = np.zeros((h, w))for i in range(m, h - m):for j in range(m, w - m):erosion_image[i, j] = binary[i - 1, j - 1] & binary[i - 1, j] & binary[i - 1, j + 1] &\binary[i, j - 1] & binary[i, j] & binary[i, j + 1] & binary[i + 1, j - 1] &\binary[i + 1, j] & binary[i + 1, j + 1]return erosion_image

三、Python实现膨胀算法

def bin_dialtion(binary, n):h, w = gray.shapem = int((n - 1) / 2)dialtion_image = np.zeros((h, w))for i in range(m, h - m):for j in range(m, w - m):dialtion_image[i, j] = binary[i - 1, j - 1] | binary[i - 1, j] | binary[i - 1, j + 1] |\binary[i, j - 1] | binary[i, j] | binary[i, j + 1] | binary[i + 1, j - 1] |\binary[i + 1, j] | binary[i + 1, j + 1]return dialtion_image

四、Python实现阈值算法

  阈值算法介于膨胀腐蚀之间,可以调整膨胀腐蚀的程度。

def threshold_method(binary, n, value):h, w = gray.shapem = int((n - 1) / 2)th_image = np.zeros((h, w))for i in range(m, h - m):for j in range(m, w - m):temp = binary[i - 1, j - 1] + binary[i - 1, j] + binary[i - 1, j + 1] +\binary[i, j - 1] + binary[i, j] + binary[i, j + 1] + binary[i + 1, j - 1] +\binary[i + 1, j] + binary[i + 1, j + 1]if temp >= value:th_image[i, j] = 1else:th_image[i, j] = 0return th_image
erosion_image = bin_erosion(bin_image, 3)
dialtion_image = bin_dialtion(bin_image, 3)
th_image = threshold_method(bin_image, 3, 8)
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(2, 2, 1)
ax.set_title("bin image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(bin_image, cmap="gray")
ax = fig.add_subplot(2, 2, 2)
ax.set_title("erosion image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(erosion_image, cmap="gray")
ax = fig.add_subplot(2, 2, 3)
ax.set_title("dialtion image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(dialtion_image, cmap="gray")
ax = fig.add_subplot(2, 2, 4)
ax.set_title("threshold image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(th_image, cmap="gray")

  画图结果如下。
在这里插入图片描述


五、FPGA实现腐蚀算法

module  ycbcr_to_erosion
(input	wire			vga_clk		,//vga时钟input	wire			sys_rst_n	,//复位信号input	wire	[7:0]	y_data	,//灰度处理的图像像素input	wire			rgb_valid	,//vga显示有效区域output	wire	[15:0]	erosion_data	//二值化像素
);
//binary data
wire [7: 0] 	bin_data;//shift ram
wire	[7:0]	data_row1	;
wire	[7:0]	data_row2	;
wire	[7:0]	data_row3	;
//3*3像素数据
reg		[7:0]	p11			;
reg		[7:0]	p12			;
reg		[7:0]	p13			;
reg		[7:0]	p21			;
reg		[7:0]	p22			;
reg		[7:0]	p23			;
reg		[7:0]	p31			;
reg		[7:0]	p32			;
reg		[7:0]	p33			;wire	[7:0]	temp	    ;
//Y值有效信号
reg				y_valid		;
//二值化
assign  bin_data  = (y_data >= 8'd128) ? 8'd255: 8'd0;
assign  data_row3 = bin_data  ;
//腐蚀
assign  temp = (p11 & p12 & p13 & p21 & p22 & p23 & p31 & p32 & p33);
//像素拼接565
assign  erosion_data = {temp[7:3], temp[7:2], temp[7:3]};
always@(posedge vga_clk or negedge sys_rst_n)	if(sys_rst_n == 1'b0)y_valid  <=  1'b0  ;elsey_valid  <=  rgb_valid  ;always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)begin{p11,p12,p13}  <=  24'd0  ;{p21,p22,p23}  <=  24'd0  ;{p31,p32,p33}  <=  24'd0  ;endelse  if(y_valid == 1'b1)begin{p11,p12,p13}  <= {p12,p13,data_row1}  ;{p21,p22,p23}  <= {p22,p23,data_row2}  ;{p31,p32,p33}  <= {p32,p33,data_row3}  ;end	elsebegin{p11,p12,p13}  <=  24'd0  ;{p21,p22,p23}  <=  24'd0  ;{p31,p32,p33}  <=  24'd0  ;end	
//移位寄存器
shift_ram_gen  shift_ram_gen_inst
(.clock 		(vga_clk	),.shiftin	(data_row3	),.shiftout 	(			),.taps0x 	(data_row2	),.taps1x 	(data_row1	)
);endmodule

在这里插入图片描述
  FPGA实现中,只讲解腐蚀算法,膨胀算法及阈值算法,感兴趣的小伙伴可以自行实现,非常easy。

总结

  膨胀腐蚀算法图像处理中常用的算法,有必要掌握。虽然简单,还是需要自己去实现,写多了,也就顺了。下期帧差法。帧差法只做Python,不做FPGA,为什么?下期揭晓答案。

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

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

相关文章

SoundTouch对音频处理(Android)

SoundTouch对音频处理&#xff08;Android&#xff09; SoundTouch介绍 SoundTouch 是一个用于音频处理的开源库&#xff0c;主要用于改变音频的速度、音调和音量等特征。您可以在项目中使用 SoundTouch 库来实现音频处理的功能&#xff0c;比如变速播放、音高变化、混响效果…

Redis(5.0)

1、什么是Redis Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库&#xff0c;它同时也提供了多种数据结构来满足不同场景下的数据存储需求。 2、安装Redis&#xff08;Linux&#xff09; 2.1、去官网&#xff08;http://www.redis.cn/&#xff09;下…

新品发布会注意事项有哪些?如何邀约媒体到场发布

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 新品发布会的注意事项以及邀约媒体到场发布的方法如下&#xff1a; 一、新品发布会注意事项&#xff1a; 明确活动目的和主题&#xff1a;确定新品发布会要传达的信息和目标&#xff0c;…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TapGesture)

支持单击、双击和多次点击事件的识别。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 TapGesture(value?: { count?: number, fingers?: number }) 参数&#xff1a; 参数名称参数类型必填参…

数学建模【模糊综合评价分析】

一、模糊综合评价分析简介 提到模糊综合评价分析&#xff0c;就先得知道模糊数学。1965年美国控制论学家L.A.Zadeh发表的论文“Fuzzy sets”标志着模糊数学的诞生。 模糊数学又称Fuzzy数学&#xff0c;是研究和处理模糊性现象的一种数学理论和方法。模糊性数学发展的主流是在…

OpenHarmony教程指南—Navigation开发 页面切换场景范例

简介 在应用开发时&#xff0c;我们常常遇到&#xff0c;需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理&#xff0c;它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载&#xff0c;navPathSta…

【视频转码】基于RK3588的视频转码探索

传统的视频转码服务基本都是基于X86下CPU、GPU转码&#xff0c;对硬件性能、功耗、成本来说都比较高。从技术角度来说现有视频转码技术有&#xff1a; 视频编码转变&#xff1a; 1. H.264 > H.265 保持视频分辨率、清晰度不变情况下&#xff0c;更改视频压缩方式&#xff0…

Tomcat SSL证书申请指南2024版本

1. 注册并登录51SSL 2. 申请证书 在订单管理中点击申请证书&#xff0c;买个便宜的就行 填写信息后提交即可&#xff1a; 3. 域名验证 为域名增加一个解析&#xff0c;按上面的记录信息。 点击订单详情里面的获取验证信息如下&#xff1a; 将上述信息放入阿里云 修改后&…

mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示

文章目录 问题描述解决方案 问题描述 如下如所示&#xff1a; 表一&#xff1a;wechat_dynamically_config表&#xff0c;重点字段&#xff1a;wechat_object 表二&#xff1a;wechat_object表&#xff0c;重点字段&#xff1a;wxid 需求&#xff1a;根据wechat_dynamically_…

3.5日常学习

matlab处理数据 自己写了关于detect_data的函数&#xff0c;让它帮我改了&#xff0c;哈哈哈 %改正前function data_chuli(path1,savepath)[num]xlsread(path1,1,B18:F23);a num;ba;cb(:);xlswrite(savepath,c) end%改正后function data_chuli(path1, savepath)num xlsread…

工业网关、物联网网关与PLC网关是什么?

网关是什么&#xff1f; 网关是一种用于连接不同网络的网络设备&#xff0c;其作用是实现网络之间的通信和数据交换。它负责将一个网络的数据转发到另一个网络&#xff0c;并且可以进行路由、转换和过滤等处理。通常用于连接局域网和广域网之间&#xff0c;可以是硬件设备或者软…

植被净初级生产力与多时间尺度干旱关系的定量研究

随着全球气候变暖的趋势愈发明显&#xff0c;干旱事件不仅发生的频率增加&#xff0c;其持续时间和影响范围也在不断扩大。干旱对生态环境造成了严重破坏&#xff0c;导致生物多样性减少、土地退化和水资源短缺&#xff1b;对农业生产而言&#xff0c;干旱会导致作物减产甚至绝…

kafka报文模拟工具的使用

日常项目中经常会碰到消费kafka某个topic的数据&#xff0c;如果知道报文格式&#xff0c;即可使用工具去模拟发送报文&#xff0c;以此测试代码中是否能正常消费到这个数据。 工具资源已上传&#xff0c;可直接访问连接下载&#xff1a;https://download.csdn.net/download/w…

SpringBoot集成ElasticSearch(ES)

ElasticSearch环境搭建 采用docker-compose搭建&#xff0c;具体配置如下&#xff1a; version: 3# 网桥es -> 方便相互通讯 networks:es:services:elasticsearch:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/elasticsearch:7.14.1 # 原镜像elasticsearch:7.…

数据库系列之:什么是 SAP HANA?

数据库系列之&#xff1a;什么是 SAP HANA&#xff1f; 一、什么是 SAP HANA&#xff1f;二、什么是内存数据库&#xff1f;三、SAP HANA 有多快&#xff1f;四、SAP HANA 的十大优势五、SAP HANA 架构六、数据库设计七、数据库管理八、应用开发九、高级分析十、数据虚拟化 一、…

4.Rust中的所有权(Rust成名绝技)

Rust成名绝技 Rust 之所以能成为万众瞩目的语言&#xff0c;就是因为其内存安全性。在以往&#xff0c;内存安全几乎都是通过 GC 的方式实现&#xff0c;但是 GC 会引来性能、内存占用以及全停顿等问题&#xff0c;在高性能场景、实时性要求高和系统编程上是不可接受的&#x…

递推与递归DFS

&#xff1b;例题引入&#xff1a; 在跳楼梯问题中&#xff0c;我们假设每次可以跳1级或2级。如果我们想跳到第N级台阶&#xff0c;那么我们的最后一次跳跃只能是1级或2级。 如果我们最后一次跳1级&#xff0c;那么我们必须先跳到第N-1级台阶。由于跳到第N-1级台阶有f(N-1)种方…

中国制造走向世界wordpress外贸建站模板主题

水泵阀门wordpress外贸网站模板 水泵、阀门、管材、管件wordpress外贸网站模板&#xff0c;适合外贸独立站的网站模板。 https://www.jianzhanpress.com/?p3748 保健器械wordpress外贸网站主题 保健、健身器械wordpress外贸网站主题&#xff0c;适合做外贸网站的wordpress模…

C语言项目实战——贪吃蛇

C语言实现贪吃蛇 前言一、 游戏背景二、游戏效果演示三、课程目标四、项目定位五、技术要点六、Win32 API介绍6.1 Win32 API6.2 控制台程序6.3 控制台屏幕上的坐标COORD6.4 GetStdHandle6.5 GetConsoleCursorInfo6.5.1 CONSOLE_CURSOR_INFO 6.6 SetConsoleCursorInfo6.7 SetCon…

如何使用程序调用通义千问

之前分享了&#xff0c;使用程序调用文心一言。但是很快文心一言就要收费了。阿里的提供了暂时免费版的基础模型&#xff0c;效果还算可以。所以再分享一下&#xff0c;如何使用程序来调用通义千问的模型。 整体很简单&#xff0c;分三步&#xff1a;导入依赖&#xff1b;获取A…