基于Python的图像阈值化分割(迭代法)


Posted in Python onNovember 20, 2020

1.阈值化分割原理

通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类。一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性。

在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中。像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类。经阈值化处理后的图像g(x,y)定义为:

基于Python的图像阈值化分割(迭代法)

其中f(x,y)为原图像,T为灰度阈值,g(x,y)为分割后产生的二值图像。

2.算法流程图

基于Python的图像阈值化分割(迭代法)

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.阈值化分割结果

原始图像

基于Python的图像阈值化分割(迭代法)

原始图像直方图

基于Python的图像阈值化分割(迭代法)

阈值化分割后图像

基于Python的图像阈值化分割(迭代法)

阈值化分割后图像直方图

基于Python的图像阈值化分割(迭代法)

到此这篇关于基于Python的图像阈值化分割(迭代法)的文章就介绍到这了,更多相关Python 图像阈值化分割内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python的设计模式编程入门指南
Apr 02 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
django 解决manage.py migrate无效的问题
May 27 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 Python
python基础之匿名函数详解
Apr 21 Python
Python中22个万用公式的小结
Jul 21 Python
Python编程编写完善的命令行工具
Sep 15 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 #Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 #Python
python IP地址转整数
Nov 20 #Python
Python django框架 web端视频加密的实例详解
Nov 20 #Python
总结python 三种常见的内存泄漏场景
Nov 20 #Python
Python偏函数实现原理及应用
Nov 20 #Python
python与idea的集成的实现
Nov 20 #Python
You might like
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
python编程羊车门问题代码示例
2017/10/25 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
Python 面试中 8 个必考问题
2018/11/16 Python
python调用自定义函数的实例操作
2019/06/26 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
自荐信格式的六要素
2013/09/21 职场文书
关于保护环境的建议书
2014/08/26 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS