基于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.阈值化分割结果

原始图像

原始图像直方图

阈值化分割后图像

阈值化分割后图像直方图

到此这篇关于基于Python的图像阈值化分割(迭代法)的文章就介绍到这了,更多相关Python 图像阈值化分割内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python opencv 简单阈值算法的实现

    本文先了解一个简单阈值函数,以了解一个阈值算法的具体参数. 然后比较不同阈值函数的区别. 同样的,先用一副图说明本文重要大纲: #! usr/bin/env python # coding: utf-8 import cv2 img = cv2.imread('cat.jpg') img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 先将图像矩阵进行二值化 # img = cv2.imread('cat.jpg',0) # 也可以直接将图像用灰度值读入,其中0

  • python找出列表中大于某个阈值的数据段示例

    该算法实现对列表中大于某个阈值(比如level=5)的连续数据段的提取,具体效果如下: 找出list里面大于5的连续数据段: list = [1,2,3,4,2,3,4,5,6,7,4,6,7,8,5,6,7,3,2,4,4,4,5,3,6,7,8,9,8,6,1] 输出: [[6, 7], [6, 7, 8], [6, 7], [6, 7, 8, 9, 8, 6]] 算法实现: # -*- coding: utf-8 -*- """ --------------------

  • python+opencv实现阈值分割

    最近老师留了几个作业,虽然用opencv很简单一句话就出来了,但是还没用python写过.在官方文档中的tutorial中的threshold里,看到可以创建两个滑动条来选择type和value,决定用python实现一下 注意python中的全局变量,用global声明 开始出现了一些问题,因为毁掉函数每次只能传回一个值,所以每次只能更新value,后来就弄了两个毁掉函数,这个时候,又出现了滑动其中一个,另一个的值就会变为默认值的情况,这个时候猜想是全局变量的问题,根据猜想改动之后果然是. 感

  • Python Pywavelet 小波阈值实例

    小波应用比较广泛,近期想使用其去噪.由于网上都是matlib实现,故记下一下Python的使用 Pywavelet  Denoising 小波去噪 # -*- coding: utf-8 -*- import numpy as np import pywt data = np.linspace(1, 4, 7) # pywt.threshold方法讲解: # pywt.threshold(data,value,mode ='soft',substitute = 0 ) # data:数据集,va

  • Python图像阈值化处理及算法比对实例解析

    图像的二值化或阈值化(Binarization)旨在提取图像中的目标物体,将背景以及噪声区分开来.通常会设定一个阈值T,通过T将图像的像素划分为两类:大于T的像素群和小于T的像素群. 灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度.二值化处理可以将图像中的像素划分为两类颜色,常用的二值化算法如公式1所示: {Y=0,gray<TY=255,gray>=T {Y=0,gray<TY=255,gray>=T​ 当灰度Gray小于阈值T时,其像素设置为0,表示黑色:

  • Python下opencv图像阈值处理的使用笔记

    图像的阈值处理一般使得图像的像素值更单一.图像更简单.阈值可以分为全局性质的阈值,也可以分为局部性质的阈值,可以是单阈值的也可以是多阈值的.当然阈值越多是越复杂的.下面将介绍opencv下的三种阈值方法. (一)简单阈值 简单阈值当然是最简单,选取一个全局阈值,然后就把整幅图像分成了非黑即白的二值图像了.函数为cv2.threshold() 这个函数有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有: cv2.THRESH_B

  • 基于Python的图像阈值化分割(迭代法)

    1.阈值化分割原理 通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类.一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性. 在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中.像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类.经阈值化处理后的

  • Python图像运算之图像阈值化处理详解

    目录 一.图像阈值化 二.固定阈值化处理 1.二进制阈值化 2.反二进制阈值化 3.截断阈值化 4.阈值化为0 5.反阈值化为0 三.自适应阈值化处理 四.总结 一.图像阈值化 图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来. 灰度化处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度.阈值化处理可以将图像中的像素划分为两类颜色,常见的阈值化算法如公式(1)所示: 当某个像素点的灰度Gray(i,j)小于

  • 基于Python制作图像完美超分处理工具

    目录 前言 安装 使用 图片超分 视频超分 项目说明 代码说明 总结 前言 很久没更新这个专栏了,最近比较忙.前段时间看到了这个模型觉着很有意思,弄下来自己玩了玩,但是没时间写文章,一直搁置到现在. 废话不多说,先上Github地址: RealBasicVSR地址 从给出的效果来看,还是很不错的,左侧是超分后的画面,右边是原画质,得到明显提升.下面我说一下我的安装过程,还有一些使用中的踩坑,让大家去测试项目的时候可以提前规避. 安装 项目拉下来之后,我们先打开README,看看说明. 安装的步骤

  • 详解基于python的图像Gabor变换及特征提取

    1.前言 在深度学习出来之前,图像识别领域北有"Gabor帮主",南有"SIFT慕容小哥".目前,深度学习技术可以利用CNN网络和大数据样本搞事情,从而取替"Gabor帮主"和"SIFT慕容小哥"的江湖地位.但,在没有大数据和算力支撑的"乡村小镇"地带,或是对付"刁民小辈","Gabor帮主"可以大显身手,具有不可撼动的地位.IT武林中,有基于C++和OpenCV,或

  • 基于Python实现图像文字识别OCR工具

    目录 引言 功能列表 OCR部分 界面部分 软件代码 参考链接 引言 最近在技术交流群里聊到一个关于图像文字识别的需求,在工作.生活中常常会用到,比如票据.漫画.扫描件.照片的文本提取. 博主基于 PyQt + PaddleOCR 写了一个桌面端的OCR工具,用于快速实现图片中文本区域自动检测+文本自动识别. 识别效果如下图所示: 所有框选区域为OCR算法自动检测,右侧列表有每个框对应的文字内容: 点击右侧"识别结果"中的文本记录,然后点击"复制到剪贴板"即可复制该

  • 基于Python实现图像的傅里叶变换

    目录 前言 (1)基本概念 (2)读取图像信息 1. 傅里叶变换 (1)基本概念 (2)numpy实现 (3)OpevCV实现  2. 傅里叶逆变换 (1)基本概念 (2)代码实现 前言 首先是本文总体代码,改一下图像的读取路径就可以运行了,但我还是建议大家先看后面的步骤一行行敲代码,这样效果更好: """ Author:XiaoMa date:2021/11/7 """ import cv2 import matplotlib.pyplot a

  • 基于python读取图像的几种方式汇总

    目录 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于matplotlib的图像读取.显示和保存 基于scikit-image的图像读取.保存和显示 基于imageio的图像读取.显示和保存 总结 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于opencv-python的图像读取.保存和显示 基于matplotlib的图像读取.保存和显示 基于scikit-image的图像读取.保存和显示 基于imageio的图像读取

  • 基于Python的图像数据增强Data Augmentation解析

    1.1 简介 深层神经网络一般都需要大量的训练数据才能获得比较理想的结果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟合. 在计算机视觉中,典型的数据增强方法有翻转(Flip),旋转(Rotat ),缩放(Scale),随机裁剪或补零(Random Crop or Pad),色彩抖动(Color jittering),加噪声(Noise) 笔者在跟进视频及图像中的人体姿态检测和关键点追踪(Human Pose Es

  • python 基于opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手:而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图. 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一

随机推荐