logo资料库

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

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
基于基于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: 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下 您可能感兴趣的文章 opencv图像阈值处理的使用笔记python opencv 简单阈值算法的实现Python Pywavelet 小波阈值实例python+opencv实现阈值 分割
分享到:
收藏