77 lines
1.7 KiB
Python
77 lines
1.7 KiB
Python
import numpy as np
|
|
import cv2
|
|
from matplotlib import pyplot as plt
|
|
|
|
|
|
def n1(hist, s):
|
|
return np.sum(hist[0:s+1])
|
|
|
|
|
|
def n2(hist, s):
|
|
return np.sum(hist[s+1:256])
|
|
|
|
|
|
def mean(hist):
|
|
k = np.arange(0, 256)
|
|
return np.sum((hist * k)) / np.sum(hist)
|
|
|
|
|
|
def mu1(hist, s, n):
|
|
k = np.arange(0, 256)
|
|
return (1 / n) * np.sum((hist * k)[0:s+1])
|
|
|
|
|
|
def mu2(hist, s, n):
|
|
k = np.arange(0, 256)
|
|
return (1 / n) * np.sum((hist * k)[s+1:256])
|
|
|
|
|
|
def sigma1(hist, s, n, mu):
|
|
k = np.arange(0, 256)
|
|
return np.sqrt((1 / n) * np.sum((hist * np.power(k - mu, 2))[0:s+1]))
|
|
|
|
|
|
def sigma2(hist, s, n, mu):
|
|
k = np.arange(0, 256)
|
|
return np.sqrt((1 / n) * np.sum((hist * np.power(k - mu, 2))[s+1:256]))
|
|
|
|
|
|
def Q(hist, s):
|
|
n_1, n_2 = n1(hist, s), n2(hist, s)
|
|
if n_1 == 0 or n_2 == 0:
|
|
return 0
|
|
mu_1, mu_2 = mu1(hist, s, n_1), mu2(hist, s, n_2)
|
|
sigma_1, sigma_2 = sigma1(hist, s, n_1, mu_1), sigma2(hist, s, n_2, mu_2)
|
|
_mean = mean(hist)
|
|
|
|
sigma_zw = n_1 * np.power(mu_1 - _mean, 2) + n_2 * np.power(mu_2 - _mean, 2)
|
|
sigma_in = n_1 * np.power(sigma_1, 2) + n_2 * np.power(sigma_2, 2)
|
|
q = np.power(sigma_zw, 2) / np.power(sigma_in, 2)
|
|
return q
|
|
|
|
''' Load data '''
|
|
# Load images and template
|
|
img = cv2.imread("../../data/cameraman.png", cv2.IMREAD_GRAYSCALE)
|
|
|
|
histr = cv2.calcHist([img], [0], None, [256], [0, 256])
|
|
histr = histr[:, 0]
|
|
plt.plot(histr)
|
|
plt.xlim([0, 256])
|
|
|
|
''' Iterate over all s '''
|
|
q_list = list()
|
|
|
|
for s in range(1, 255):
|
|
q_list.append(Q(histr, s))
|
|
|
|
optimal_s = np.argmax(np.asarray(q_list))
|
|
print("Threshold:", optimal_s)
|
|
|
|
''' Visualize result '''
|
|
mask = img >= optimal_s
|
|
|
|
cv2.imshow("img", img)
|
|
cv2.imshow("mask", mask.astype(np.uint8) * 255)
|
|
|
|
plt.show()
|
|
cv2.waitKey(0) |