基于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 21 Python
Python文件去除注释的方法
May 25 Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 Python
pyqt5中QThread在使用时出现重复emit的实例
Jun 21 Python
Django  ORM 练习题及答案
Jul 19 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python2与Python3的区别点整理
Dec 12 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
教你使用pyinstaller打包Python教程
May 27 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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
2.PHP入门
2006/10/09 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
javascript基本类型详解
2014/11/28 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
原生js实现随机点名
2020/07/05 Javascript
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
numpy返回array中元素的index方法
2018/06/27 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
Python中Selenium库使用教程详解
2020/07/23 Python
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
初中生评语大全
2014/04/24 职场文书
超市开店计划书
2014/04/26 职场文书
销售个人求职信范文
2014/04/28 职场文书
小学生安全责任书
2014/07/25 职场文书
法人委托书的范本格式
2014/09/11 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
Hive导入csv文件示例
2022/06/25 数据库