基于Python的图像阈值化分割(迭代法)
作者:大牌Anderson 发布时间:2022-10-23 21:25:01
标签:Python,图像,阈值,分割
1.阈值化分割原理
通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类。一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性。
在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中。像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类。经阈值化处理后的图像g(x,y)定义为:
其中f(x,y)为原图像,T为灰度阈值,g(x,y)为分割后产生的二值图像。
2.算法流程图
3.代码实现
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
#读入图片并转化为矩阵
img = plt.imread('2.jpg')
im = np.array(img)
# 矩阵大小
l = len(im)
w = len(im[0])
#求初始阈值
zmin = np.min(im)
zmax = np.max(im)
t0 = int((zmin+zmax)/2)
#初始化相关变量初始化
t1=0
res1=0
res2=0
s1=0
s2=0
#迭代法计算最佳阈值
while abs(t0-t1)>0:
for i in range(0,l-1):
for j in range(0,w-1):
if im[i,j]<t0:
res1=res1+im[i,j]
s1=s1+1
elif im[i,j]>t0:
res2=res2+im[i,j]
s2=s2+1
avg1=res1/s1
avg2=res2/s2
res1 = 0
res2 = 0
s1 = 0
s2 = 0
t1 = t0 #旧阈值储存在t1中
t0=int((avg1+avg2)/2) #计算新阈值
#阈值化分割
#像素点灰度值小于最佳阈值t0用0填充,其余用255填充
im = np.where(im[...,:] < t0, 0, 255)
#绘制原图窗口
plt.figure()
plt.imshow(img , cmap='gray')
plt.title('original')
#绘制原图直方图并显示最佳阈值
plt.figure()
plt.hist(img.ravel(),256)
plt.title('hist')
plt.axvline(t0) #绘制最佳阈值分割线
plt.text(25, 6100, "Best Threshold:{}".format(t0), size = 15, alpha = 0.8)
#绘制阈值化分割后图像
plt.figure()
plt.imshow(Image.fromarray(im) , cmap='gray')
plt.title('new')
#绘制阈值化分割后图像的直方图
plt.figure()
plt.hist(im.ravel(),256)
plt.title('hist')
plt.show()
4.阈值化分割结果
原始图像
原始图像直方图
阈值化分割后图像
阈值化分割后图像直方图
来源:https://blog.csdn.net/AllErrors/article/details/109827807
0
投稿
猜你喜欢
- PyQt5 Qt Designer (Qt设计师)PyQt5是对Qt所有类进行封装, Qt能开发的东西, PyQt都能开发.Qt是强大的GU
- Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python的四个内置数据类型功不可没,他们即是list, tuple, d
- range()是Python的内置函数,用于创建整数的列表,可以生成递增或者递减的数列。xrange也有相同的功能, 今天来看下它们之间的
- 图像(包括动图)是传递信息的一种高效方式,往往能增强表象、记忆与思维等方面的反应强度。所谓一图胜千言,说的就是这个道理。今天为大家整理了十张
- 本文实例讲述了Python设计实现的计算器功能。分享给大家供大家参考,具体如下:通过利用PYTHON 设计处理计算器的功能如:1 - 2 *
- Django2.0 通过URL访问上传的文件(pdf、picture等)Django是一个成熟的web框架,基于python实现,有很多的优
- zipfile模块是python中一个处理压缩文件的模块,解决了不少我们平常需要处理压缩文件的需求 ,本文主要谈谈zipfile几个常用的用
- python读取pdf文档一、 准备工作安装对应的库pip install pdfminer3kpip install pdfminer.s
- 在布尔索引中,我们将根据 DataFrame 中数据的实际值而不是它们的行/列标签或整数位置来选择数据子集。在布尔索引中,我们使用布尔向量来
- PDOStatement::closeCursorPDOStatement::closeCursor — 关闭游标,使语句能再次被执行。(P
- 一、环境windows二、下载进入Anaconda 官网进行下载 安装 找到安装包所在的目录,双击安装包点击 Next点击 I A
- 总的来说,提高应用程序性能的最好的方法是发现应用的瓶径之所在,和数据库进行交互的性能无疑是决定应用程序性能的重要环节之一。因为ADO是当前最
- 前言: 在数据库运维过程中,我们时常会关注数据库的链接情况,比如总共有多少链接、有多少活跃链接、有没有执行时间过长的链接等。数据库
- 本文实例讲述了Python找出序列中出现次数最多的元素。分享给大家供大家参考,具体如下:问题:找出一个元素序列中出现次数最多的元素是什么解决
- 前言VScode是一个相当优秀的IDE,具备开源、跨平台、模块化、插件丰富、启动时间快、颜值高、可高度定制等等优秀的特质,不愧是微软爸爸的私
- 一级行政区经纬度一级行政区(省级行政区):34个(23个省、5个自治区、4个直辖市、2个特别行政区)provinces = {
- MySQL中的锁锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发控制主要采用的技术手段(具体
- 1、查询锁情况select sid,serial#,event,BLOCKING_SESSION from v$session where
- 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定
- df.fillna主要用来对缺失值进行填充,可以选择填充具体的数字,或者选择临近填充。官方文档DataFrame.fillna(self,