基于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的迭代器与生成器实例详解
Jul 16 Python
浅谈Python中的闭包
Jul 08 Python
python实现图片处理和特征提取详解
Nov 13 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
python用plt画图时,cmp设置方法
Dec 13 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
Python3中urlencode和urldecode的用法详解
Jul 23 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
python动态视频下载器的实现方法
Sep 16 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 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命名空间(Namespace)简明教程
2014/06/11 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
Python正则表达式知识汇总
2017/09/22 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
元旦晚会邀请函
2014/01/27 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
小学端午节活动方案
2014/03/13 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
晚会开幕词
2015/01/28 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
导游词之镇江焦山
2019/11/21 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
Python实现批量自动整理文件
2022/03/16 Python
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android