图像处理中的算法实现

2020-03-17  本文已影响0人  此间不留白

图像处理算法中了解了图像处理算法的一些理论知识,包括图像直方图和图像二值化,本篇文章将会结合上篇文章的理论知识,利用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()  #将二维矩阵,转化为一维数组
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)

最后,统计量\delta_b最大值所对应的下标就是所求得阈值

sigma_total.index(max(sigma_total))

最后,求得结果,如下所示:



考虑到图像质量原因(题目中的图像为截图)手动算法与cv库算法求得结果较为接近
上一篇 下一篇

猜你喜欢

热点阅读