基于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 Django(图文)
Nov 04 Python
Python实现设置windows桌面壁纸代码分享
Mar 28 Python
Python实现定时任务
Feb 08 Python
Python实现的弹球小游戏示例
Aug 01 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
python使用fork实现守护进程的方法
Nov 16 Python
Python安装Flask环境及简单应用示例
May 03 Python
Python中logging日志库实例详解
Feb 19 Python
Python控制台实现交互式环境执行
Jun 09 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
anaconda python3.8安装后降级
Jun 11 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 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常用Output和ptions/Info函数集介绍
2013/06/19 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
php常用数组函数实例小结
2016/12/29 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
数据库笔试题
2013/05/09 面试题
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
运动会口号16字
2014/06/07 职场文书
员工安全生产责任书
2014/07/22 职场文书
医药销售自我评价200字
2014/09/11 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
大学教师个人总结
2015/02/10 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
pandas中pd.groupby()的用法详解
2022/06/16 Python