#熵演算法閾值
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...