在图像处理算法中了解了图像处理算法的一些理论知识,包括图像直方图和图像二值化,本篇文章将会结合上篇文章的理论知识,利用python实现图像直方图和图像二值化
图像直方图的绘制
如下图所示的图像,直方图的绘制代码如下所示:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 加载图片
src = Image.open("./1.PNG")
r,g,b,v = src_1.split() #通道分离,医学图像,四通道
rn = np.array(r) # 将图像转换为数组形式
rn = rn.flatten() # 将矩阵转换为一维数组
n, bins, patches = plt.hist(rn, bins=256, normed=1, facecolor='gray', alpha=0.75)
plt.show()
绘制完图像的直方图分布如下图所示:
图像二值化的实现
图像二值化的实现,关键是找到一个阈值,实现图像的分割,根据之前所学,图像二值化的实现主要有OTSU算法和熵方法,对于上述图像而言,OTSU算法求取最大阈值的代码如下所示:
- 加载图像,选取一通道,将其转换为一维数组,以方便处理:
src_1 = Image.open("./1.PNG")
r,g,b,v = src_1.split()
rn = np.array(r)
rn = rn.flatten() #将二维矩阵,转化为一维数组
- 求解统计量 每个灰度出现的频率,为了方便处理,去掉频率为0的灰度
rnp = np.bincount(rn)/len(rn) # 统计每个灰度在所有像素中的频率
rnp = rnp.tolist()
rnp_remove = []
for i in rnp:
if i!=0.0:
rnp_remove.append(i)
# 对频率进行累加处理,方便后续步骤求解
rnp_total = []
rnp_sum = 0
for i in range(0,len(rnp_remove)):
rnp_sum = rnp_sum+rnp_remove[i]
rnp_total.append(rnp_sum)
- 求解统计量均值
mean_total = []
mean = 0
for i in range(0,len(rnp_remove)):
mean = mean+rnp_remove[i]*i/rnp_total[i]
mean_total.append(mean)
- 求解统计量方差
sigma = []
s = 0
for i in range(0,len(rnp_remove)):
s =s + (i-mean_total[i])**2*rnp[i]
sigma.append(s)
sigma_total =[]
for i in range (0,len(rnp_remove)):
w_0 = rnp_total[i]
w_1 = 1-w_0
mu_0 = mean_total[i]
mu_1 = mean_total[len(rnp_remove)-1]-mean_total[i]
sigma_b = w_0*w_1*(mu_0-mu_1)**2
sigma_total.append(sigma_b)
最后,统计量最大值所对应的下标就是所求得阈值
sigma_total.index(max(sigma_total))
最后,求得结果,如下所示:
网友评论