基于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 相关文章推荐
2款Python内存检测工具介绍和使用方法
Jun 01 Python
Python中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
用map函数来完成Python并行任务的简单示例
Apr 02 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
Python实现的文本编辑器功能示例
Jun 30 Python
python3.x上post发送json数据
Mar 04 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
Python小白不正确的使用类变量实例
May 29 Python
python是怎么被发明的
Jun 15 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
python 字符串格式化的示例
Sep 21 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 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查询搜索引擎排名位置的代码
2010/01/05 PHP
php include加载文件两种方式效率比较
2010/08/08 PHP
PHP读取Excel类文件
2017/05/15 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
Python实现遍历数据库并获取key的值
2015/05/17 Python
python实现将内容分行输出
2015/11/05 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
带你认识Django
2019/01/15 Python
django创建超级用户过程解析
2019/09/18 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
行政助理岗位职责范文
2013/12/03 职场文书
人事助理自荐信
2014/02/02 职场文书
家长写给老师的建议书
2014/03/13 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
就业协议书范本
2014/10/08 职场文书
离职感谢信怎么写
2015/01/22 职场文书
公司经营目标责任书
2015/01/29 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
Python中基础数据类型 set集合知识点总结
2021/08/02 Python