python图像二值化处理

目录

1、双峰法

2、P参数法

3、迭代法

4、OTSU法


图像的二值化处理是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。二值化是图像分割的一种最简单的方法,可以把灰度图像转换成二值图像。具体实现是将大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。

根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。常见的二值化方法有双峰法、P参数法、迭代法和OTSU法等。其中,双峰法是通过寻找直方图上的两个最高峰,将阈值选取在两个峰之间的最低处;P参数法是根据图像的直方图分布情况,动态地确定一个阈值;迭代法是通过多次迭代计算,逐渐逼近最佳的阈值;OTSU法则是通过最大化类间方差来确定最佳阈值。

1、双峰法

双峰法是一种简单的二值化处理方法,其基本思想是找到图像直方图中的两个最大值,并将阈值设定在这两个峰值之间的最低处。这种方法适用于背景和前景差异较大的图像。

import cv2
import numpy as np
def find_peaks(hist):# 找到直方图中的峰值peaks = []for i in range(1, len(hist) - 1):if hist[i] > hist[i - 1] and hist[i] > hist[i + 1]:peaks.append(i)# 返回前两个峰值(如果存在)if len(peaks) >= 2:return peaks[0], peaks[1]else:return None, None
# 读取图像并转换为灰度图像
image = cv2.imread(r'1.jpg', cv2.IMREAD_GRAYSCALE)
​
# 计算图像的直方图
hist, bins = np.histogram(image.ravel(), 256, [0, 256])
​
# 找到直方图中的两个峰值
peak1, peak2 = find_peaks(hist)
​
# 计算阈值,取两个峰值的平均值作为阈值
threshold = int((peak1 + peak2) / 2)
​
# 对图像进行二值化处理
binary_image = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)[1]
​
# 显示二值化后的图像
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、P参数法

P参数法是一种图像二值化处理方法,用于将灰度图像转换为二值图像。它基于图像的局部信息进行操作,具体步骤如下:

  1. 选择一个合适的阈值T(0 ≤ T ≤ 255)作为全局阈值。

  2. 对于图像中的每个像素点,计算其周围邻域内像素的均值和标准差。如果该像素的灰度值大于等于均值加上参数P乘以标准差,则将其设置为白色(255),否则设置为黑色(0)。

import cv2
import numpy as np
​
def p_thresholding(image, P):# 将图片转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
​# 获取图像大小height, width = gray_image.shape
​# 初始化输出二值图像binary_image = np.zeros((height, width), np.uint8)
​for i in range(height):for j in range(width):# 计算像素的周围邻域内像素的均值和标准差neighborhood_mean = np.mean(gray_image[max(0, i-1):min(height, i+2), max(0, j-1):min(width, j+2)])neighborhood_std = np.std(gray_image[max(0, i-1):min(height, i+2), max(0, j-1):min(width, j+2)])
​# 根据P参数法判断像素的二值化结果if gray_image[i, j] >= neighborhood_mean + P * neighborhood_std:binary_image[i, j] = 255else:binary_image[i, j] = 0
​return binary_image
​
# 读取图像
image = cv2.imread(r'q.jpg')
​
# 设置参数P的值
P = 0.2
​
# 调用P参数法二值化函数
binary_image = p_thresholding(image, P)
​
# 显示原始图像和二值图像
cv2.imshow('Original Image', image)
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
​

3、迭代法

基本原理很简单:

(1)选择灰度图的平均值作为初始阈值T0 ;

(2)计算小于等于T0的平均值T1, 和大于T0的平均值T2;

(3)新的阈值为T = (T1 + T2)/ 2;

(4)比较T和T0,若相等,则返回T,即为迭代阈值; 否则 T0 = T,重复(1)-(3)

import cv2
​
def iterative_thresholding(image, threshold=127):# 初始化二值化结果binary_image = image.copy()
​# 迭代更新阈值prev_threshold = 0while threshold != prev_threshold:prev_threshold = threshold
​# 计算两个区域的平均灰度值region1_mean = image[image <= threshold].mean()region2_mean = image[image > threshold].mean()
​# 更新阈值threshold = (region1_mean + region2_mean) // 2
​# 根据新的阈值进行二值化binary_image[image <= threshold] = 0binary_image[image > threshold] = 255
​return binary_image
​
# 读取图像
image = cv2.imread(r'C:\Users\Downloads\q.jpg')
​
# 调用迭代法二值化函数
binary_image = iterative_thresholding(image)
​
# 显示结果
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4、OTSU法

最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种确定图像二值化分割阈值的算法。算法假设图像像素能够根据全局阈值,被分成背景[background]和目标[objects]两部分。然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。

从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

import cv2
​
# 读取图像并转换为灰度图像
image = cv2.imread(r'q.jpg', cv2.IMREAD_GRAYSCALE)
​
# 使用OTSU法计算最佳阈值
ret, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 显示二值化后的图像
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

C# WPF上位机开发(ExtendedWPFToolkit扩展包使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 虽然个人认为当前的c# wpf内容已经足够多&#xff0c;但是肯定还是有很多个性化的需求没有满足。比如说不够好看&#xff0c;比如说动画效果不好&a…

解决ZooKeeper中/rmstore无法删除问题

无法删除znode /rmstore的原因在于yarn在注册时候候自己添加上ACL&#xff0c;导致无法直接删除。解决办法&#xff1a;重新设置ACL。 首先&#xff0c;查看ACL&#xff1a;getAcl /rmstore/ZKRMStateRoot 之后&#xff0c;重新设置ACL&#xff1a;setAcl /rmstore/ZKRMState…

SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?

文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里&#xff0c;MVCC的实现机制是不同的。本节我们会以InnoDB举例&#xff0c;讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念&#xff1a; 事务版本号行记录的隐藏…

任务十六:主备备份型防火墙双机热备

目录 目的 器材 拓扑 步骤 一、基本配置 配置各路由器接口的IP地址【省略】 1、配置BGP协议实现Internet路由器之间互联 2、防火墙FW1和FW2接口IP配置与区域划分 3、配置区域间转发策略 4、配置NAPT和默认路由 5、配置VRRP组&#xff0c;并加入Active/standby VGMP管…

Windows下配置最新ChromeDriver

1、问题 在使用代码调用谷歌浏览器时会出错&#xff1a; from selenium import webdriver driver webdriver.Chrome() SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser versi…

KSP音频抓包

1. 按照网上其他教程&#xff0c;安装KSP抓音频 Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;38&#xff09;-- KSP in MDE - 大大通(简体站) Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;22&#xff09;--DSP音频链路监听 - 大大通(简体站) <<Biu~笔记&#xff1a;高…

AX7A200教程(9): ov5640摄像头输出显示720p视频

一&#xff0c;功能框图 ov5640摄像头视频通过ddr3缓存后&#xff0c;最后使用hdmi接口进行输出显示 二&#xff0c;摄像头硬件说明 2.1&#xff0c;像头硬件管脚 如下图所示&#xff0c;一共18个管脚 2.2&#xff0c;摄像头电源初始化时序 因这个ov5640摄像头是买的老摄像…

JDK bug:ciObjectFactory::create_new_metadata

文章目录 1、问题2.详细日志3.JDK&#xff1a;bug最终bug链接&#xff1a; 京东遇到过类似bug各位大佬如果有更详细的解答可以留言。 1、问题 Problematic frame: V [libjvm.so0x438067] ciObjectFactory::create_new_metadata(Metadata*)0x327 关键字还是ciObjectFactory::cr…

关键字、标识符、变量、基本数据类型

一、关键字&#xff08;Keyword&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; 特点&#xff1a;全部关键字都是小写字母 Java关键字查询关键地址&#xff1a; http:// https://docs.oracle.com/j…

电影小镇智慧旅游项目技术方案:PPT全文111页,附下载

关键词&#xff1a;智慧旅游项目平台&#xff0c;智慧文旅建设&#xff0c;智慧城市建设&#xff0c;智慧文旅解决方案&#xff0c;智慧旅游技术应用&#xff0c;智慧旅游典型方案&#xff0c;智慧旅游景区方案&#xff0c;智慧旅游发展规划 一、智慧旅游的起源 智慧地球是IB…

机器学习:增强式学习Reinforcement learning

收集有标签数据比较困难的时候同时也不知道什么答案是比较好的时候可以考虑使用强化学习通过互动&#xff0c;机器可以自己知道什么结果是好的&#xff0c;什么结果是坏的 Outline 什么是RL Action就是一个functionEnvironment就是告诉这个Action是好的还是坏的 例子 Space i…

算法专题二:滑动窗口

算法专题二&#xff1a;滑动窗口 一.长度最小的子数组&#xff1a;1.思路一&#xff1a;暴力解法2.思路二&#xff1a;滑动窗口双指针3.GIF题目解析&#xff1a;思路一&#xff1a;思路二&#xff1a; 二.无重复字符的最长子串&#xff1a;1.思路一&#xff1a;滑动窗口2.GIF题…

Android-----AndroidManifests.xml 之meta-data

一、概念 meta-data&#xff1a;元数据、文件元数据。主要用来定义一些组件相关的配置值。 metadata是一组供父组件使用的名值对&#xff08;name-value pair&#xff09;&#xff0c;一个组件元素可以包含任意数量的meta-data子元素。这些子元素的值存放在一个 Bundle 对象中…

【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

论文标题&#xff1a;Open X-Embodiment: Robotic Learning Datasets and RT-X Models 论文作者&#xff1a;– 论文原文&#xff1a;https://arxiv.org/abs/2310.08864 论文出处&#xff1a;– 论文被引&#xff1a;–&#xff08;12/18/2023&#xff09; 论文代码&#xff1a…

轻量封装WebGPU渲染系统示例<53>- 多盏灯灯光照在地面的效果

WebGPU实时渲染实现模拟多盏灯的灯光照在地面的效果灯光效果 。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MultiLightsTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源…

2018年第七届数学建模国际赛小美赛B题世界杯足球赛的赛制安排解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 B题 世界杯足球赛的赛制安排 原题再现&#xff1a; 有32支球队参加国际足联世界杯决赛阶段的比赛。但从2026年开始&#xff0c;球队的数量将增加到48支。由于时间有限&#xff0c;一支球队不能打太多比赛。因此&#xff0c;国际足联提议改变…

计网02-计算机网络参考模型

一、OSI七层参考模型 1、分层的思想 分层模型用于网络协议的设计方法&#xff0c;本质是将网络节点间复杂的通信问题分成若干简单的问题逐一解决&#xff0c;通过网络的层次去找问题&#xff0c;将复杂问题简单化。 2、OSI参考模型 由于早期计算机厂商使用的是私有的网络模…

【PHP入门】2.1-运算符

-运算符- 运算符&#xff1a;operator&#xff0c;是一种将数据进行运算的特殊符号&#xff0c;在PHP中一共有十种运算符之多。 2.1.1赋值运算符 赋值运算&#xff1a;符号是“”&#xff0c;表示将右边的结果&#xff08;可以是变量、数据、常量和其它运算出来的结果&#…

scroll-behavior属性使用方法

定义和用法&#xff1a; scroll-behavior 属性规定当用户单击可滚动框中的链接时&#xff0c;是否平滑地&#xff08;具动画效果&#xff09;滚动位置&#xff0c;而不是直线跳转。 <style>element{/* 核心代码 */scroll-behavior: smooth;} </style> 属性值&am…

云原生之深入解析减少Docker镜像大小的优化技巧

一、什么是 Docker&#xff1f; Docker 是一种容器引擎&#xff0c;可以在容器内运行一段代码&#xff0c;Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。要构建镜像&#xff0c;docker 使用一个名为 Dockerfile 的文件&#xff0c;Dockerfile 是一个包…