基于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 self,cls,decorator的理解
Jul 13 Python
Python3基础之函数用法
Aug 13 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
儿童学习python的一些小技巧
May 27 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
python适合人工智能的理由和优势
Jun 28 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
Dec 25 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
如何教少儿学习Python编程
Jul 10 Python
Python日志器使用方法及原理解析
Sep 27 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 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/08 PHP
PHP输入流php://input介绍
2012/09/18 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
Python读写Excel文件的实例
2013/11/01 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
django orm模块中的 is_delete用法
2020/05/20 Python
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
学院领导推荐信
2013/10/30 职场文书
女娲补天教学反思
2014/02/05 职场文书
40岁生日感言
2014/02/15 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
劳资协议书范本
2014/04/23 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
商场父亲节活动方案
2014/08/27 职场文书
地理科学专业自荐信
2014/09/01 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
专业见习报告范文
2014/11/03 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL