基于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实现爬取逐浪小说的方法
Jul 07 Python
Python实现字符串格式化的方法小结
Feb 20 Python
Python实现的桶排序算法示例
Nov 29 Python
python机器学习之神经网络(二)
Dec 20 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
Python输出各行命令详解
Feb 01 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
python中正则表达式与模式匹配
May 07 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
Python 实现向word(docx)中输出
Feb 13 Python
python能做哪些生活有趣的事情
Sep 09 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 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
Windows下安装Memcached的步骤说明
2010/04/25 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Python实现的读写json文件功能示例
2018/06/05 Python
python实现人民币大写转换
2018/06/20 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
公务员的自我鉴定
2013/10/26 职场文书
2014年领班工作总结
2014/11/25 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技
浅谈Node的内存泄露问题
2022/05/06 NodeJs
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android