基于Python的图像阈值化分割(迭代法)
作者:大牌Anderson 发布时间:2022-10-23 21:25:01
标签:Python,图像,阈值,分割
1.阈值化分割原理
通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类。一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性。
在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中。像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类。经阈值化处理后的图像g(x,y)定义为:
其中f(x,y)为原图像,T为灰度阈值,g(x,y)为分割后产生的二值图像。
2.算法流程图
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.阈值化分割结果
原始图像
原始图像直方图
阈值化分割后图像
阈值化分割后图像直方图
来源:https://blog.csdn.net/AllErrors/article/details/109827807
0
投稿
猜你喜欢
- 1、使用 append 函数来为列表 list 添加数据,默认将数据追加在末尾。# !usr/bin/env python# -*- cod
- 帮网友小改了一下主题. 任务比较简单, 只是为一个三栏主题添加对 Widget 的支持而已,就先从这次简单的案例开始说吧.单侧边栏funct
- 在我们关于SQL服务器安全系列的这文章里,我们的目标是向你提供安全安装SQL服务器所需要的工具和信心,这样的话,你有价值的数据就会受到保护,
- 一段非常简单代码普通调用方式def console1(a, b): print("进入函数")
- http通过StreamingHttpResponse完成连续的数据传输长链接问题http服务之间传递结果流一个由flask封装起来的算法,
- 一、元素偏移量 offset 系列offset 翻译过来就是偏移量, 我们使用 offset 系列相关属性可以动态的得到该元素的位置(偏移)
- 我正在开发一个档案管理系统,需要从数据库中同时调出图像及相关的文字说明,可我只做到了单纯地显示图片,像有一个数据库CHUNFENG,在数据库
- 在HTML中,常见的URL有多种表示方式:相对URL: example.php demo
- 首先呢,需要有两个mysql服务器。如果做测试的话可以在同一台机器上装两个mysql服务程序,注意要两个运行程序的端口不能一样。我用的是一个
- 前言经典面试题: 判断一个字符串里面的括号是否闭合,如:{{()}} 就是一个闭合的字符串。{{()}]} 这个里面 ([)] 括号不对称,
- 函数很简单, 主要是针对字符串和数字两种类型的传入数据分别进行了处理,具体用法:字符类型的strUsername = C
- 在分析sIFR之前,先来快速的了解一下sIFR是什么,以及它是如何工作的。sIFR表示scalable Inman Flash Replac
- 个人网站如有会员注册模块+动网论坛的话,那网站要与动网论坛系统整合,实现不同Web系统之间的用户信息同步更新、登录等操作就不是件容易的事了,
- 前言前面我们已经介绍了 python面向对象入门教程之从代码复用开始(一) ,这篇文章主要介绍的是关于Python面向对象之设置对
- 概述从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类
- 0 环境Python版本:3.6.8系统版本:macOS MojavePython Jupyter Notebook1 引言七月了,大家最近
- 如下所示:import dateutildef before_month_lastday(ti): today=dateutil
- 由于我们分发的python应用可能运行在64位环境,也可能运行在32位环境,所以我们需要为同一套应用代码配置两套打包环境,怎么配置?步骤如下
- 代码如下: <% '屏蔽主流的下载工具 Dimxurl,xtool '获取浏览器AGENT xurl=lcase(Re
- 引言经过函数学习之后我们会发现函数不被调用是不会直接执行的,我们在之前的函数调用之后发现运行的结果都是函数体内print()打印出来的结果,