学习笔记6(opencv+python阈值分割(最大熵))

@ 图像阈值分割(最大熵方法)

老规矩,看相关函数(哈哈,没有啥函数)

步骤

1.进行归一化直方图

2.累加概率直方图

3.求出各个灰度级的熵

4.计算最大熵时的阈值

计算公式
1.normHist为归一化的直方图,这里不做介绍
2.累加概率直方图
在这里插入图片描述
3.求出各个灰度级的熵
在这里插入图片描述

4.计算最大熵时的阈值计算:f(t)=f1(t)+f2(t)最大化的t值,该值即为得到的阈值,即thresh=argmax(f(t))
学习笔记6(opencv+python阈值分割(最大熵))_第1张图片

上代码

#相关包
import numpy as np
import cv2
import imutils
import time
import matplotlib.pyplot as plt
from PIL import *
from tensorflow.keras.preprocessing.image import img_to_array,array_to_img
from skimage.filters import threshold_local
path=r"C:\Users\Administrator\Desktop\22.jpg"
# imag=img_to_array(Image.open(path).convert("L").resize((224,224)))
# imag=Image.open(path).convert("L").resize((224,224))
# plt.imshow(imag)
# plt.show()
imag=cv2.imdecode(np.fromfile(path),-1)
imag=cv2.cvtColor(imag,cv2.COLOR_BGR2GRAY)
cv2.imshow("a",imag)
cv2.waitKey()
cv2.destroyAllWindows()

学习笔记6(opencv+python阈值分割(最大熵))_第2张图片

直方图

def calcGrayHist(image):
    rows, cols = image.shape
    grayHist = np.zeros([256])
    for r in range(rows):
        for c in range(cols):
            grayHist[int(image[r,c])] += 1

    return grayHist
 normgrayHist=calcGrayHist(np.array(imag))
index = np.arange(256)
plt.figure(figsize=(40,10))
p2 = plt.bar(index, normgrayHist,label="threshold", color="g")
# index=index.astype(np.int)
# a=a.astype(np.int)
for i,j in zip(index,normgrayHist):
    plt.text(i,j,'%.3f'%(j*10), ha = 'center',va = 'bottom',fontsize=11)
plt.legend()
# plt.imshow(p2)
plt.show()

学习笔记6(opencv+python阈值分割(最大熵))_第3张图片

最大熵

def threshEntroy(image):
    rows,cols=image.shape
    #获取直方图
    grayHist=calcGrayHist(image)
    #得到概率直方图
    normgrayHist=grayHist/float(rows*cols)

    zeroCumuMoment=np.zeros([256],np.float32)
    for k in range(256):
        if k==0:
            zeroCumuMoment[k]=normgrayHist[k]
        else:
            zeroCumuMoment[k]=zeroCumuMoment[k-1]+normgrayHist[k]
    entropy=np.zeros([256],np.float32)
    #计算熵
    for k in range(256):
        if k==0:
            if normgrayHist[k]==0:
                entropy[k]=0
            else:
                entropy[k]=-normgrayHist[k]*np.log10(normgrayHist[k])
        else:
            if normgrayHist[k]==0:
                entropy[k]=entropy[k-1]
            else:
                entropy[k]=entropy[k-1]-normgrayHist[k]*np.log10(normgrayHist[k])
                
                
    ft=np.zeros([256],np.float32)
    ft1,ft2=0.,0.
    totalEntropy=entropy[255]
    for k in range(255):
    #找最大值
        maxfornt=np.max(normgrayHist[:k+1])
        maxback=np.max(normgrayHist[k+1:256])
        if (maxfornt==0 or zeroCumuMoment[k]==0 or maxfornt==1 or zeroCumuMoment[k]==1 or totalEntropy==0):
            ft1=0
        else:
            ft1=entropy[k]/totalEntropy*(np.log10(zeroCumuMoment[k])/np.log10(maxfornt))
        if(maxback==0 or 1-zeroCumuMoment[k]==0 or maxback==1 or 1-zeroCumuMoment[k]==1):
            ft2=0
        else:
            if totalEntropy==0:
                ft2=(np.log10(1-zeroCumuMoment[k])/np.log10(maxback))
            else:
                ft2=(1-entropy[k]/totalEntropy)*(np.log10(1-zeroCumuMoment[k])/np.log10(maxback))
        ft[k]=ft1+ft2
  #找出最大值的索引,作为得到的阈值
    thresloc=np.where(ft==np.max(ft))
    thresh=thresloc[0][0]

    #阈值处理
    threshold=np.copy(image)
    threshold[threshold>thresh]=255
    threshold[threshold<=thresh]=0
    #返回分割图像,最大阈值,最大熵和熵
    return threshold,thresh,max(ft),entropy
b,a,c,e=threshEntroy(np.array(imag))
#结果显示
#b=np.expand_dims(b,axis=-1)
#d=array_to_img(b)

# d.shape
#plt.imshow(d)
cv2.imshow("f",b)
cv2.waitKey()

学习笔记6(opencv+python阈值分割(最大熵))_第4张图片
学习笔记6(opencv+python阈值分割(最大熵))_第5张图片
学习笔记6(opencv+python阈值分割(最大熵))_第6张图片

你可能感兴趣的:(opencv,深度学习,python,cv)