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.shape
    m = 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.shape
    m = 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.shape
    m = 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] = 1
           else:
               th_image[i, j] = 0
    return 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  ;
	else
		y_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  ;
		end
	else  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	
	else
		begin
			{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,为什么?下期揭晓答案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第13天

239. 滑动窗口最大值 &#xff08;一刷至少需要理解思路&#xff09; 方法&#xff1a;暴力法 &#xff08;时间超出限制&#xff09; 注意&#xff1a; 代码&#xff1a; class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k…

掌握 Vue3、Vite 和 SCSS 实现一键换肤的魔法步骤

前言 一个网站的换肤效果算是一个比较常见的功能&#xff0c;尤其是在后台管理系统中&#xff0c;我们几乎都能看到他的身影&#xff0c;这里给大家提供一个实现思路。 搭建项目 vitevue3搭建项目这里就不演示了&#xff0c;vite官网里面讲得很清楚。 注&#xff1a;这里使…

【YOLO v5 v7 v8 v9小目标改进】辅助超推理SAHI:分而治之,解决高分辨率图像中小物体检测的问题

辅助超推理SAHI&#xff1a;分而治之&#xff0c;解决高分辨率图像中小物体检测的问题 设计思路结构小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 论文&#xff1a;https://arxiv.org/pdf/2202.06934.pdf 代码&#xff1a;https://github.com/obss/sahi 设计思…

Java+SpringBoot+Vue+MySQL:农业管理新篇章

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Git基础知多少

什么是Git Git 是分布式版本控制系统&#xff08;DVCS&#xff09;。它可以跟踪文件的更改&#xff0c;并允许你恢复到任何特定版本的更改。与 SVN 等其他版本控制系统&#xff08;VCS&#xff09;相比&#xff0c;其分布式架构具有许多优势&#xff0c;一个主要优点是它不依赖…

本地知识库搭建成功后,企业效率真的翻倍了

在如今这个快节奏的信息时代&#xff0c;对企业来说&#xff0c;拥有一套高效的知识管理系统早已不再是选项&#xff0c;而是必要。而本地知识库&#xff0c;它这个集信息存储、管理和查询于一体的平台&#xff0c;不仅改变了公司信息资源共享的方式&#xff0c;还帮助进一步提…

DataLoader

import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter# 准备的测试数据集 数据放在了CIFAR10文件夹下test_data torchvision.datasets.CIFAR10("./CIFAR10",trainFalse, transformtorchvision.transfor…

Flutter性能优化

性能分析工具 &#xff08;1&#xff09;performance overlay 开启performance overlay后&#xff0c;Flutter APP上将显示一个展示一个浮层&#xff0c;浮层中会实时展示当前的UI线程及Raster线程的运行情况。如果都是蓝色竖条&#xff0c;说明界面运行流畅&#xff0c;否则则…

Conda快速安装的解决方法(Mamba安装)

如果你的Conda安装了&#xff0c;你可能会发现一个问题&#xff0c;就是使用Conda install 安装某个软件时&#xff0c;会特别慢&#xff0c;这时候呢&#xff1f;你会上网去搜&#xff0c;然后大家解决的方法呢。一是告诉你镜像可以下载快一点&#xff0c;二是&#xff0c;Mam…

华为OD机试 - 疫情扩散时间计算 - 矩阵(Java 2024 C卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&am…

基于OpenCV的图形分析辨认03

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

spring 注解缓存查询方法使用

spring-boot项目启动类上加注解: EnableCaching 查询方法注解: Cacheable

Sodinokibi勒索病毒最新变种,勒索巨额赎金

前言 Sodinokibi勒索病毒在国内首次被发现于2019年4月份&#xff0c;2019年5月24日首次在意大利被发现&#xff0c;在意大利被发现使用RDP攻击的方式进行传播感染&#xff0c;这款病毒被称为GandCrab勒索病毒的接班人&#xff0c;在短短几个月的时间内&#xff0c;已经在全球大…

缺陷检测:使用PatchCore训练自己的数据集

文章目录 前期准备两种方法 演示运行结果 代码详解见缺陷检测–PatchCore的代码解读 前期准备 必须包含有训练图片&#xff08;无缺陷图片&#xff09;、测试图片&#xff08;缺陷图片&#xff09;和ground_truth&#xff0c;并且ground_truth必须与对应图片的名称相同。 本文…

学习Java的第一天

一、Java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。 后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff0c;Jav…

AI如何为人力资源服务?

组织的核心都是人力资源。从招聘到员工培养&#xff0c;再到评估员工绩效&#xff0c;人力资源&#xff08;HR&#xff09;在公司的持续发展中起着至关重要的作用。表面上看&#xff0c;这似乎是一个简单的任务。然而&#xff0c;实际上&#xff0c;这是世界上最复杂和最具挑战…

[数据结构初阶】栈

各位读者老爷好&#xff0c;鼠鼠我好久没写博客了&#xff08;太摆烂了&#xff09;&#xff0c;今天就基于C语言浅介绍一下数据结构里面的栈&#xff0c;希望对你有所帮助吧。 目录 1.栈的概念及结构 2.栈的实现 2.1定义栈 2.2.初始化栈 2.3.入栈 2.4.出栈 2.5.获取栈…

【Java EE初阶三十】JVM的简单学习

1. JVM 内存区域划分 一个运行起来的 Java 进程&#xff0c;就是一个 JVM 虚拟机&#xff0c;需要从操作系统申请一大块内存&#xff0c;就会把这个内存&#xff0c;划分成不同的区域&#xff0c;每个区域都有不同的作用. JVM 申请了一大块内存之后,也会划分成不同的内…

Git 基于ED25519、RSA算法生成 SSH 密钥

Git 基于ED25519、RSA算法生成 SSH 密钥 基于ED25519算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t ed25519 -C "邮箱地址"基于RSA算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t rsa -C "<注释内容>"基于ED255…

Day14:信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全

目录 Web服务器&应用服务器差异性 WAF防火墙&安全防护&识别技术 蜜罐平台&安全防护&识别技术 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/…