Python与FPGA——局部二值化

news2025/1/20 20:05:50

文章目录

  • 前言
  • 一、局部二值化
  • 二、Python局部二值化
  • 三、FPGA局部二值化
  • 总结


前言

  局部二值化较全局二值化难,我们将在此实现Python与FPGA的局部二值化处理。


一、局部二值化

  局部二值化就是使用一个窗口,在图像上进行扫描,每扫出9个像素求平均,再和阈值进行比较。如果9个像素的平均值大与等于阈值,就将窗口中心对应的图像像素设置为255,否则就设置为0。

在这里插入图片描述

二、Python局部二值化

  以下虽然是局部二值化处理,但是在此基础上,增加了阈值乘以一个ratio小数,可以调整阈值,实现局部阈值二值化处理。

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]
def local_threshold(gray, ratio, threshold, size=3):
    h, w = gray.shape
    m = int((size - 1) / 2)
    local_image = np.zeros((h, w))
    for i in range(m, h - m):
        for j in range(m, w - m):
            value = np.floor((np.sum(gray[i - m: i + m + 1, j - m: j  + m + 1]) / (size ** 2)) * ratio)
            if(value <= threshold):
                local_image[i, j] = 0
            else:
                local_image[i, j] = 255
    return local_image.astype(np.uint8)

local_image = local_threshold(gray, 0.9, 128, 3)
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1, 2, 1)
ax.set_title("gray image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
ax = fig.add_subplot(1, 2, 2)
ax.set_title("local image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(local_image, cmap="gray")

在这里插入图片描述

三、FPGA局部二值化

module  ycbcr2binary_local
(
	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]	binary_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  data_row3 = y_data  ;
//中值拼接565
assign  temp = (p11 + p12 + p13 + p21 + p22 + p23 + p31 + p32 + p33) / 9;//9个像素平均值
assign  binary_data = (temp >= 8'd128) ? 16'hffff: 16'h0000;//比较并设置像素
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中,小编没有将阈值乘上一个小数,如果要和Python实现一致,你也可以尝试加上。


总结

  图像二值化也就告一段落,二值化比较基础,下一章节聊聊sobel边缘检测。还是一样,sobel是谁不重要,重要的是要用他去完成sobel检测。敬请期待。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ps:曲线

曲线 Curves是 Photoshop 中强大的色彩调整工具&#xff0c;提供了对图像亮度和颜色的精细控制&#xff0c;正确使用曲线可以显著改善图像的质量和风格。 Ps菜单&#xff1a;图像/调整/曲线 Image/Adjustments/Curves 快捷键&#xff1a;Ctrl M Ps菜单&#xff1a;图层/新建调…

使用Java生成JWT(JSON Web Token)的详细指南

介绍 在现代应用程序中&#xff0c;身份验证和授权是至关重要的。JSON Web Token&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式用于在各方之间安全地传输信息。在本文中&#xff0c;我们将学习如何使…

基于Flask的宠物领养系统的设计与实现

基于Flask的宠物领养系统的设计与实现 涉及技术&#xff1a;python3.10flaskmysql8.0 系统分为普通用户和管理员两种角色&#xff0c;普通用户可以浏览搜索宠物&#xff0c;申请领养宠物&#xff1b;管理员可以分布宠物信息&#xff0c;管理系统等。 采用ORM模型创建数据&am…

本地项目推送到腾讯云轻量应用服务器教程(并实现本地推送远程自动更新)

将本地项目上传到腾讯云轻量应用服务器并实现后续的推送更新&#xff0c;具体步骤如下&#xff1a; 在本地项目目录下初始化 Git 仓库&#xff1a; cd 项目目录 git init将项目文件添加到 Git 仓库并提交&#xff1a; git add . git commit -m "Initial commit"在…

让娃学习效率更高的“可视化”时间管理器

如果要问&#xff0c;老母亲在娃开学后&#xff0c;蕞着急孩子哪一种坏习惯&#xff0c;那时间管理肯定榜上有名&#xff01; 做作业的时候&#xff0c;才写了5分钟&#xff0c;已经没有耐心了&#xff0c;东摸摸西看看&#xff0c;一会说肚子疼想上厕所&#xff0c;一会又拿出…

STM32CubeIDE基础学习-相关工程文件介绍

STM32CubeIDE基础学习-相关工程文件介绍 前言 保存的工程要大致了解熟悉里面的文件代表的是什么意思、干什么用的&#xff0c;这样才方便后面使用或移植代码等。 当成功创建工程后&#xff0c;打开基础工程保存路径后可以看到所有文件如下图所示&#xff1a; 如果工程越复杂&a…

Vant组件中van-overlay页面太长无法滚动

内容太长&#xff0c;发现电脑中滚轮可以滚动&#xff0c;但是手机端手指滑动动不了。 在组件上加lock-scroll <van-overlay :lock-scroll"false"> 默认为true 注&#xff1a;我使用的版本是4.8.5&#xff0c;据说2版本不生效。

Unreal 5打开Windows虚拟键盘的权限问题

可以通过以下代码打开Windows虚拟键盘 void UMouseSimulatorBPLibrary::ShowVirtualKeyboard() {TCHAR* OskPath L"C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe";if (!FPaths::FileExists(OskPath)){OskPath L"C:\\windows\\system…

阿里云Linux系统MySQL8忘记密码修改密码

相关版本 操作系统&#xff1a;Alibaba Cloud Linux 3.2104 LTS 64位MySQL&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 (Source distribution) MySQL版本可通过下方命令查询 mysql --version一、修改my.cnf文件 文件位置&#xff1a;etc/my.cnf进入远程连接后可以打…

Vue3.2 + vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案

chunk-vendors.js 是/node_modules 目录下的所有模块打包成的包&#xff0c; 但是这包太大导致页面加载很慢&#xff08;我的都要3-4秒了&#xff09;&#xff0c; 这个时候就会出现白屏的情况 解决方案 1、compression-webpack-plugin 插件解决方案 1&#xff09;、安装 npm …

微服务获取登录用户Id与单体服务下获取用户Id对比(黑马头条Day03)

前置声明 当前前后端分离开发项目中&#xff0c;后端某个请求向具体某个数据库中的多个表插入数据时&#xff0c;经常需要使用到当前登录用户的Id&#xff08;唯一标识&#xff09;。在当前用户线程下以实现变量共享&#xff0c;同时为了避免不同用户线程之间操作变量的影响&am…

SpringCloud(20)之Skywalking Agent原理剖析

一、Agent原理剖析 使用Skywalking的时候&#xff0c;并没有修改程序中任何一行 Java 代码&#xff0c;这里便使用到了 Java Agent 技术&#xff0c;我 们接下来展开对Java Agent 技术的学习。 1.1 Java Agent Java Agent 是从 JDK1.5 开始引入的&#xff0c;算是一个比较老的…

LVS负载均衡集群基础概念

目录 一、集群 1、集群概述 1.1 什么是集群 1.2 集群系统扩展方式 1.2.1 Scale UP&#xff08;纵向扩展&#xff09; 1.2.2 Scale OUT&#xff08;横向扩展&#xff09; 1.2.3 区别 1.3 分布式系统 1.4 分布式与集群 1.5 集群设计原则 1.6 集群设计实现 1.6.1 基础…

【kubernetes】关于k8s集群的pod控制器

目录 一、deployment控制器 二、statefulset控制器 1、验证数据可以持久化 2、验证删除后名称不会改变&#xff0c;数据还会一直存在 3、验证扩容的创建过程是升序串行执行&#xff0c;并且自动创建pv 4、验证滚动更新的时候也是升序执行&#xff0c;数据持久化还在 5、验…

Java面试(1)之 JVM篇

内存模型及原理 1, JVM内存模型 2, 类加载器及双亲委派模型 2.1 类加载器的作用? 将Java文件解析成Class文件对象,即 通过一个类的全限定名来得到其二进制字节流.(不同类加载器加载的对象一定不同) 2.2 什么是双亲委派模型? 如果一个类接收到类加载的请求不会自己去加载,…

Nodejs 第五十二章(定时任务)

什么是定时任务&#xff1f; 定时任务是指在预定的时间点或时间间隔内执行的任务或操作。它们是自动化执行特定逻辑的一种方式&#xff0c;可用于执行重复性的、周期性的或计划性的任务。 定时任务通常用于以下情况&#xff1a; 执行后台任务&#xff1a;定时任务可用于自动…

NLP:spacy库安装与zh_core_web_sm配置

到公司来第一个项目竟然是偏文本信息抽取与结构化的&#xff0c;&#xff08;也太高看我了┭┮﹏┭┮&#xff09; 反正给机会了就上吧&#xff0c;我就一臭实习的&#xff0c;怕个啥。配置了两天的环境&#xff0c;也踩了不少坑&#xff0c;我把我的经历给大家分享一下&#…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+OSD动态字符叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS多路视频融合叠加应用…

弹性地基梁matlab有限元编程 | 双排桩支护结构 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

微信小程序(五十二)开屏页面效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.使用控件模拟开屏界面 2.倒计时逻辑 3.布局方法 4.TabBar隐藏复现 源码&#xff1a; components/openPage/openPage.wxml <view class"openPage-box"><image src"{{imagePath}}"…