基于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多线程编程简单介绍
Apr 13 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
python getpass实现密文实例详解
Sep 24 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
Python远程方法调用实现过程解析
Jul 28 Python
Python tkinter制作单机五子棋游戏
Sep 14 Python
python操作链表的示例代码
Sep 27 Python
python中_del_还原数据的方法
Dec 09 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年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
PHP 日,周,月点击排行统计
2012/01/11 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
document.compatMode介绍
2009/05/21 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
python发送HTTP请求的方法小结
2015/07/08 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
失业者真诚求职信范文
2013/12/25 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
新手上路标语
2014/06/20 职场文书
员工试用期自我评价
2014/09/18 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
亮剑观后感600字
2015/06/05 职场文书
升学宴学生致辞
2015/07/27 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
科级干部培训心得体会
2016/01/06 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书