Python实现图像最大熵分割
import numpy as np
import cv2
def segment(img):
"""
最大熵分割
:param img:
:return:
"""
def calculate_current_entropy(hist, threshold):
data_hist = hist.copy()
background_sum = 0.
target_sum = 0.
for i in range(256):
if i < threshold: # 累积背景
background_sum += data_hist[i]
else: # 累积目标
target_sum += data_hist[i]
background_ent = 0.
target_ent = 0.
for i in range(256):
if i < threshold: # 计算背景熵
if data_hist[i] == 0:
continue
ratio1 = data_hist[i] / background_sum
background_ent -= ratio1 * np.log2(ratio1)
else:
if data_hist[i] == 0:
continue
ratio2 = data_hist[i] / target_sum
target_ent -= ratio2 * np.log2(ratio2)
return target_ent + background_ent
def max_entropy_segmentation(img):
channels = [0]
hist_size = [256]
prange = [0, 256]
hist = cv2.calcHist(img, channels, None, hist_size, prange)
hist = np.reshape(hist, [-1])
max_ent = 0.
max_index = 0
for i in range(256):
cur_ent = calculate_current_entropy(hist, i)
if cur_ent > max_ent:
max_ent = cur_ent
max_index = i
ret, th = cv2.threshold(img, max_index, 255, cv2.THRESH_BINARY)
return th
img = max_entropy_segmentation(img)
return img
[1] OpenCV学习笔记(二)之最大熵阈值分割, https://blog.csdn.net/spw_1201/article/details/53510711.