时间:2021-05-23
1.阈值化分割原理
通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类。一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性。
在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中。像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类。经阈值化处理后的图像g(x,y)定义为:
其中f(x,y)为原图像,T为灰度阈值,g(x,y)为分割后产生的二值图像。
2.算法流程图
3.代码实现
from PIL import Imageimport matplotlib.pyplot as pltimport 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=0res1=0res2=0s1=0s2=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 图像阈值化分割内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
投影法多用于图像的阈值分割。闲话不多说,现用Python实现。上代码。importcv2importnumpyimg=cv2.imread('D:/0.jpg'
本文实例讲述了javascript基于牛顿迭代法实现求浮点数的平方根。分享给大家供大家参考,具体如下:今天在网上看到一则利用牛顿迭代法求浮点数的平方根的方法,发
前言上一篇文章,我们讲解了图像处理中的亮度和对比度的变化,这篇文章我们来做一个阈值函数。最简单的图像分割方法阈值是最简单的图像分割方法。比如为了从下图中分割出苹
这篇文章主要介绍了python实现迭代法求方程组的根过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下有
我就废话不多说了,直接上代码大家一起看吧!#Gauss迭代法输入系数矩阵mx、值矩阵mr、迭代次数n(以list模拟矩阵行优先)defGauss(mx,mr,n