基于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编程中三条常用的技巧
May 11 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
解决使用export_graphviz可视化树报错的问题
Aug 09 Python
基于Tensorflow高阶读写教程
Feb 10 Python
详解Python的三种拷贝方式
Feb 11 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
Mar 18 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
Python基于traceback模块获取异常信息
Jul 23 Python
python删除文件、清空目录的实现方法
Sep 23 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自动给文章加关键词链接的函数代码
2012/11/29 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php解析xml方法实例详解
2015/05/12 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
Python WEB应用部署的实现方法
2019/01/02 Python
Python构建图像分类识别器的方法
2019/01/12 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
Python with语句和过程抽取思想
2019/12/23 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
国际贸易专业自荐信
2014/06/10 职场文书
学校食品安全实施方案
2014/06/14 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
基层工作经验证明样本
2014/11/16 职场文书
小学语文复习计划
2015/01/19 职场文书
合理化建议书
2015/02/04 职场文书
公司董事任命书
2015/09/21 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python