Python与FPGA——全局二值化

文章目录

  • 前言
  • 一、Python全局128
  • 二、Python全局均值
  • 三、Python全局OTSU
  • 四、FPGA全局128
  • 总结


前言

  为什么要进行图像二值化,rgb图像有三个通道,处理图像的计算量较大,二值化的图像极大的减少了处理图像的计算量。即便从彩色图像转成了二值化图像,也不影响对物体的识别。本章开始讲解图像二值化。Python包含全局128、全局均值、大津阈值法(OTSU);FPGA只做全局128的讲解。


一、Python全局128

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, 255, 0)#全局二值化
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("binary image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(bin_image, cmap="gray")

在这里插入图片描述


二、Python全局均值

mean_image = np.where(gray > np.mean(gray), 255, 0)#全局均值
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("mean image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(mean_image, cmap="gray")

在这里插入图片描述


三、Python全局OTSU

  OTSU是阈值分割中一种常用的算法,它可以根据图像自动生成最佳分割阈值。 OTSU的核心思想是类间方差最大化。

  1. 初始化一个阈值T0,将图像分为前景f和背景b;
  2. 图像像素点个数为图像N=height x width,前景像素个数Nf,背景像素个数Nb;
  3. 图像灰度等级L-1(0~255=256),每个灰度等级像素个数Ni,满足以下公式:

P f = ∑ i = 0 i = T 0 N i N P b = ∑ i = T 0 i = L − 1 N i N (1) Pf = \sum_{i = 0}^{i=T0}\frac{Ni}{N} \quad\quad Pb= \sum_{i = T0}^{i=L-1}\frac{Ni}{N}\tag{1} Pf=i=0i=T0NNiPb=i=T0i=L1NNi(1)

  1. 前景和背景的灰度平均值分别为:

M f = ∑ i = 0 i = T 0 i × P i P f M b = ∑ i = T 0 i = L − 1 i × P i P b (2) Mf = \sum_{i = 0}^{i=T0}i \times \frac{Pi}{Pf} \quad\quad Mb= \sum_{i = T0}^{i=L-1}i\times\frac{Pi}{Pb}\tag{2} Mf=i=0i=T0i×PfPiMb=i=T0i=L1i×PbPi(2)

  1. 整个图像灰度平均值:
    M = P f × M f + P b × M b (3) M = Pf \times Mf + Pb \times Mb\tag{3} M=Pf×Mf+Pb×Mb(3)

  2. 求前景和背景之间的方差:
    σ 2 = P f × ( M f − M ) 2 + P b × ( M b − M ) 2 (4) \sigma^2 = Pf\times(Mf-M)^2 + Pb \times(Mb-M)^2\tag{4} σ2=Pf×(MfM)2+Pb×(MbM)2(4)

  3. 找到阈值T0,使得公式4最大;

  4. 怎么找?可以采用优化算法,本文中直接遍历灰度等级,查找最优阈值。

"""
统计像素点函数
image: 输入灰度图(ndarray)
reutrn: {像素:个数}(dict)
"""
def pixel_num(image):h, w = image.shapepdict = {}for i in range(h):for j in range(w):if image[i,j] in pdict:pdict[image[i,j]] += 1else:pdict[image[i,j]] = 0return pdict"""
求公式4中sigma2的值
T0: 预设阈值(int)
gray: 灰度图(ndarray)
L: 灰度等级(int)
"""
def sigma2(T0, gray, L=256):h, w = gray.shapeN = h * wpdict = pixel_num(gray)pf = sum([v for k,v in pdict.items() if k < T0]) / N#公式1pb = sum([v for k,v in pdict.items() if k >= T0]) / N#公式1pf = [pf if pf > 1e-6 else 1e-6][0]#控制最小值,避免除以0pb = [pb if pb > 1e-6 else 1e-6][0]#控制最小值,避免除以0mf = sum([k * pdict.get(k, 0) / N for k in range(T0)]) / pf#公式2mb = sum([k * pdict.get(k, 0) / N for k in range(T0, L)]) / pb#公式2M = pf * mf + pb * mb#公式3s2 = pf * (mf - M) ** 2 + pb * (mb - M) ** 2#公式4return s2, T0"""
遍历查找最大sigma2
gray: 灰度图(ndarray)
L: 灰度等级(int)
"""
def otsu(gray, L=256):smax = 0tmax = 0for t in range(1, L):s2, T0 = sigma2(t, gray, L)if s2 > smax:smax = s2tmax = T0return smax, tmax"""
根据最佳阈值求二值化图像
threshold: 最佳阈值(int)
return: 二值化图像(ndarray)
"""
def otsu_threshold(max_threshold, gray):threshold = np.mean(gray)binary = np.where(gray >= max_threshold, 255, 0)return binarysmax, tmax = otsu(gray, 256)  
otsu_image = otsu_threshold(tmax, gray)
plt.figure(figsize=(10,10))
ax = plt.subplot(1, 2, 1)
ax.set_title("gray image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
ax = plt.subplot(1, 2, 2)
ax.set_title("otsu image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(otsu_image, cmap="gray")

在这里插入图片描述
  大津阈值法计算量较大,FPGA实现没有意义。


四、FPGA全局128

module  ycbcr2binary_global
(input	wire			vga_clk		,input	wire			sys_rst_n	,input	wire	[7:0]	y_data	    ,input   wire            rgb_valid   ,output	reg		[15:0]	binary_data
);
wire [7: 0] temp;
reg        y_valid;
assign temp = (y_data >= 8'd128)? 8'd255: 8'd0;	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)binary_data  <=  16'd0  ;else if(y_valid == 1'b1)binary_data  <=  {temp[7:3], temp[7:2], temp[7:3]};elsebinary_data <= binary_data;
endmodule

在这里插入图片描述


总结

  全局二值化都比较基础,Python与FPGA实现都较为简单。下期讨论难度升级的局部二值化,敬请期待。

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

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

相关文章

view的两种实现方式

想通过一个小功能的实现来表达我对编程的一些看法 一个多列表选择框&#xff0c;我第一种方案用了一个自定义view逻辑全写在一个类里&#xff0c;一个小时内很快就搞定了 但我也清楚&#xff0c;会有很大一些人如果看这个代码&#xff0c;会觉得很乱&#xff0c;甚至看不懂&…

linux系统---selinux

目录 前言 一、SELinux 的作用及权限管理机制 1.SELinux 的作用 1.1DAC 1.2MAC 1.3DAC 和 MAC 的对比 2.SELinux 基本概念 2.1主体&#xff08;Subject&#xff09; 2.2对象&#xff08;Object&#xff09; 2.3政策和规则&#xff08;Policy & Rule&#xff09; …

强化学习中动作价值函数和状态价值函数的联系区别?

在强化学习中&#xff0c;动作价值函数&#xff08;Q函数&#xff09;和状态价值函数&#xff08;V函数&#xff09;都是值函数&#xff0c;用于评估在不同状态或状态动作对下的值。它们之间存在联系&#xff0c;但有一些区别&#xff1a; 动作价值函数&#xff08;Q函数&#…

Web自动化测试框架-PO模式

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Python接口自动化之cookie、session应用!

以下介绍cookie、session原理及在接口自动化中的应用。 HTTP 协议是一种无状态协议&#xff0c;即每次服务端接收到客户端的请求时&#xff0c;都是一个全新的请求&#xff0c;服务器并不知道客户端的历史请求记录&#xff1b;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的…

L2-002 链表去重(Java)

给定一个带整数键值的链表 L&#xff0c;你需要把其中绝对值重复的键值结点删掉。即对每个键值 K&#xff0c;只有第一个绝对值等于 K 的结点被保留。同时&#xff0c;所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15&#xff0c;你需要输出去重后…

对列表的元素进行验证

摘要&#xff1a;开发中经常需要校验用户提交的值是否满足要求&#xff0c;Valid可用于方法参数、返回值等的验证&#xff0c;但是对于参数为列表时无效&#xff0c;此处记录几种对列表进行验证的方法 Valid 注解通常用于验证单个对象的字段&#xff0c;而不是整个列表。仅添加…

NetSuite Mass Update 批量更新功能

NetSuite中有一个小而精的便捷功能&#xff0c;但是也是一个很容易在实践中被大家遗忘的隐藏功能&#xff0c;就是Mass Update批量更新&#xff0c;在此想和各位分享一下&#xff5e;该功能主要是可以帮助用户快速将符合固定标准的记录中的单个/多个字段直接进行批量更新。如果…

快速批量将图片变成圆角怎么弄?教你一键将图片批量加圆角

在我们日常工作中&#xff0c;在设计图片的时候会要求将直角变成圆角&#xff0c;那么为什么要这么做呢&#xff1f;首先从圆角的设计语言上来说说&#xff0c;圆角看起来很现代&#xff0c;传达给人的感觉是温和友善的&#xff0c;被广泛的应用在产品中的图标、按钮等地方。而…

旷视IPC网络摄像机RTSP地址规则

主码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0000 子码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0001 三码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0002 带用户名密码格式&#xff0c;主码流&#xff1a;rtsp://admin:pw…

OJ习题之——圆括号编码

圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码&#xff1a; &#xff08;1&#xff09;用一个整数序列Pp1 p2 … pn编码&#xff0c;pi代表在S中第i个右圆括号的左圆括号数量。&#xff08;记为…

检测和处理异常之封装内建函数

​我们现在给出一个交互操作的例子 - 从最基本的错误检测开始, 然后逐步改进它, 增强代码的健壮性. 这里的问题是把一个用字符串表示的数值转换 为正确的数值表示形式, 而且在过程中要检测并处理可能的错误. float() 内建函数的基本作用是把任意一个数值类型转换为一个浮点数…

代码第二十四天-寻找旋转排序数组中的最小值Ⅱ

寻找旋转排序数组中的最小值Ⅱ 题目要求 解题思路 二分法 当遇到两个left、right两个位置值相同时候&#xff0c;可以选择将 right right-1 代码 class Solution:def findMin(self, nums: List[int]) -> int:left,right0,len(nums)-1while left<right:mid(leftright…

HarmonyOS—配置编译构建信息

在进行应用/服务的编译构建前&#xff0c;需要对工程和编译构建的Module进行设置。API Version 9、API Version 8与API Version 4~7的构建体系不同&#xff0c;因此在设置编译构建信息时也存在差异&#xff1a; API Version 9&#xff1a;需要对构建配置文件、构建脚本、应用依…

一文读懂HDMI的演变-从HDMI1.0到HDMI2.1(建议收藏)

HDMI&#xff0c;全称为&#xff08;High Definition Multimedia Interface&#xff09;高清多媒体接口&#xff0c;主要用于传输高清音视频信号。 HDMI System HDMI系统包括HDMI的source和HDMI的sink, 其中source 是源端&#xff0c;即信号的来源&#xff1b;Sink的接收端&a…

Keepalived群集

目录 一、Keepalive基础 1.1 vrrp技术 1.2 VRRP相关技术 1.3.VRRP工作过程 1.4.Keeplived、VRRP及其工作原理 1.5.Keepalived体系主要模块及其作用 1.6.配置LVSKeepalived高可用群集 配置NFS服务器192.168.52.110 192.168.52.120web1服务器 192.168.52.130web2服务器 配…

哇!!!!这个个人博客好好看!!!

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

前端算法之归并排序

5、归并排序&#xff08;Merge Sort&#xff09; 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…

C++性能优化 —— TCMalloc的原理与使用

一、TCMalloc简介 1、TCMalloc简介 TCMalloc(Thread-Caching Malloc&#xff0c;线程缓存的malloc&#xff09;是Google开发的内存分配算法库&#xff0c;最初作为Google性能工具库 perftools 的一部分&#xff0c;提供高效的多线程内存管理实现&#xff0c;用于替代操作系统…

基于AFDPF主动频率偏移法的孤岛检测Simulink仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于AFDPF主动频率偏移法的孤岛检测Simulink仿真。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a 36 4.系统原理简介 在分布式发电系统中&#xff0c;孤…