基于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之PyUnit单元测试实例
Oct 11 Python
Python回调函数用法实例详解
Jul 02 Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
Dec 18 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
pycharm远程开发项目的实现步骤
Jan 20 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
Python collections模块使用方法详解
Aug 28 Python
浅析python内置模块collections
Nov 15 Python
使用Python测试Ping主机IP和某端口是否开放的实例
Dec 17 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
python实现最短路径的实例方法
Jul 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命令行使用方法和命令行参数说明
2014/04/08 PHP
接收键盘指令的脚本
2006/06/26 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
python复制文件的方法实例详解
2015/05/22 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
python 将md5转为16字节的方法
2018/05/29 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
商务日语专业毕业生自荐信
2014/03/27 职场文书
《去年的树》教学反思
2014/04/11 职场文书
应届大学生自荐书
2014/06/17 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL