基于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 03 Python
python生成ppt的方法
Jun 07 Python
python实现NB-IoT模块远程控制
Jun 20 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python使用zip将list转为json的方法
Dec 31 Python
基于python实现KNN分类算法
Apr 23 Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 Python
python 实现矩阵填充0的例子
Nov 29 Python
python实现TCP文件传输
Mar 20 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
在python中读取和写入CSV文件详情
Jun 28 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
php和html的区别点详细总结
2019/09/24 PHP
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python 以16进制打印输出的方法
2018/07/09 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
优秀的教师个人的中文求职信
2013/09/21 职场文书
工作说明书格式
2014/07/29 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS