Python图像阈值化分割实战:迭代法原理与代码实现
本文详细介绍基于Python的图像阈值化分割技术,重点解析迭代法原理。通过灰度直方图的双峰特性确定初始阈值,并迭代计算最佳分割值。文章包含完整的算法流程图、Python代码实现及结果展示,适用于目标与背景灰度差异明显的图像分割场景。
阈值化分割原理
1.阈值化分割原理
该方法通过对图像灰度直方图进行数学统计,设定一个或多个阈值,将像素点划分到不同的类别中。通常情况下,若图像由灰度值差异较大的目标和背景构成,且目标区域内像素灰度分布均匀,背景区域像素也在另一灰度级上分布均匀,此时图像的灰度直方图会呈现明显的双峰特征。
针对上述情况,选取位于两个峰值之间谷底所对应的灰度值T作为灰度阈值。将图像中各像素的灰度值与阈值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 图像阈值化分割内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









