熵演算法閾值

2021-09-25 03:15:56 字數 3034 閱讀 4820

#熵演算法閾值

import sys,cv2,math

import numpy as np

import matplotlib.pyplot as plt

def calcgrayhist(image):

rows,cols = image.shape

grayhist = np.zeros([256],np.uint64)

for r in range(rows):

for c in range(cols):

grayhist[image[r][c]] +=1#把影象灰度值作為索引

return(grayhist)

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]*math.log10(normgrayhist[k])

else:

if normgrayhist[k] ==0:

entropy[k]=entropy[k-1]

else:

entropy[k]=entropy[k-1]-normgrayhist[k]*math.log10(normgrayhist[k])

#找閾值

ft = np.zeros([256],np.float32)

ft1,ft2 = 0.0,0.0

totalentroy = entropy[255]

for k in range(255):

#找最大值

maxfront = np.max(normgrayhist[0:k+1])

maxback = np.max(normgrayhist[k+1:256])

if (maxfront==0 or zerocumumoment[k]==0 or maxfront==1 or zerocumumoment[k]==1 or totalentroy==0):

ft1 = 0

else:

ft1=entropy[k]/totalentroy*(math.log10(zerocumumoment[k])/math.log10(maxfront))

if (maxback==0 or 1-zerocumumoment[k]==0 or maxback==1 or 1-zerocumumoment[k]==1 ):

ft2 = 0

else:

if totalentroy==0:

ft2 = (math.log10(1-zerocumumoment[k])/math.log10(maxback))

else:

ft2=(1-entropy[k]/totalentroy)*(math.log10(1-zerocumumoment[k])/math.log10(maxback))

ft[k] = ft1+ft2

#找最大值的索引,作為得到的閾值

threshloc = np.where(ft==np.max(ft))

thresh = threshloc[0][0]

#閾值處理

結果

閾值分割 最大熵分割法

最大熵分割法 現在主要用的熵演算法有 p 氏熵演算法,ksw 熵演算法 jm 熵演算法下面以經典的 ksw 熵演算法為例介紹其原理和計算過程。ksw熵演算法 設分割閾值為設分割閾值為t,t為的灰度分布,b為的灰度分布,則概率分布為 定義函式 t 為h t 和h b 的和,則 求出 t 最大時的灰度級...

otsu閾值分割演算法原理 閾值分割 Otsu法

演算法實現 不呼叫函式 include include using namespace std using namespace cv 實現灰度直方圖的繪製 void drawpicture mat inpicture,mat outpicture ma hist const int bins 256...

python opencv 簡單閾值演算法

本文先了解乙個簡單閾值函式,以了解乙個閾值演算法的具體引數。然後比較不同閾值函式的區別。同樣的,先用一副圖說明本文重要大綱 先將影象矩陣進行二值化 也可以直接將影象用灰度值讀入,其中0就表示用灰度讀圖 cv2.imshow img img img1 cv2.threshold img,100,250...