基于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 返回汉字的汉语拼音
Feb 27 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
python GUI图形化编程wxpython的使用
Jul 19 Python
如何在Django项目中引入静态文件
Jul 26 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
Python 经典算法100及解析(小结)
Sep 13 Python
基于python实现蓝牙通信代码实例
Nov 19 Python
Python Selenium 设置元素等待的三种方式
Mar 18 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
Python识别验证码的实现示例
Sep 30 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添加MySQL数据记录代码
2008/06/07 PHP
php实现微信支付之退款功能
2018/05/30 PHP
prototype1.4中文手册
2006/09/22 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
python实现简单ftp客户端的方法
2015/06/28 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
Python socket处理client连接过程解析
2020/03/18 Python
python中温度单位转换的实例方法
2020/12/27 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
协议书与合同的区别
2014/04/18 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
学生逃课检讨书
2015/02/17 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书