基于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创建和使用字典实例详解
Nov 01 Python
python逐行读取文件内容的三种方法
Jan 20 Python
详解用Python处理HTML转义字符的5种方式
Dec 27 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
基于Python打造账号共享浏览器功能
May 30 Python
使用python画社交网络图实例代码
Jul 10 Python
python tkinter canvas使用实例
Nov 04 Python
Python socket模块方法实现详解
Nov 05 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Python gevent协程切换实现详解
Sep 14 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/04/09 欧美动漫
PHP 金额数字转换成英文
2010/05/06 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
php如何连接sql server
2015/10/16 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
Python队列的定义与使用方法示例
2017/06/24 Python
python实现kMeans算法
2017/12/21 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
夜大毕业自我鉴定
2013/10/11 职场文书
青年教师典范事迹材料
2014/01/31 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android