基于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之折腾一下目录
Oct 24 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
python妙用之编码的转换详解
Apr 21 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
python字典的setdefault的巧妙用法
Aug 07 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
django下创建多个app并设置urls方法
Aug 02 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 Python
python和opencv构建运动检测器的实现
Mar 03 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常用代码
2006/11/23 PHP
php csv操作类代码
2009/12/14 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
php实现上传图片保存到数据库的方法
2015/02/11 PHP
原始的js代码和jquery对比体会
2013/09/10 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
Python 专题三 字符串的基础知识
2017/03/19 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
Django中create和save方法的不同
2019/08/13 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
佳能英国官方网站:Canon UK
2017/08/08 全球购物
中海讯通笔试题
2015/09/15 面试题
保护母亲河倡议书
2014/04/14 职场文书
奉献演讲稿范文
2014/05/21 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
美术教师求职信范文
2015/03/20 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
Python  lambda匿名函数和三元运算符
2022/04/19 Python