我试图自己实现直方图均衡功能,但没有得到所需的输出图像。
import numpy as np
import cv2
import matplotlib.pyplot as plt
import math
%matplotlib inline
def freq(lst):
d = {}
for i in lst:
for j in i:
if d.get(j):
d[j] += 1
else:
d[j] = 1
return d
def probability(d,total_pixels):
l = {}
for i in range(256):
value = d.get(i)
if value != None:
l[i] = value/total_pixels
return l
def equalizer(d, l):
f_dic = {}
last_sum = 0
for i in range(l):
if d.get(i):
prob = d.get(i)
last_sum = last_sum+((l-1)*prob)
f_dic[i] = math.floor(last_sum)
return f_dic
def replace_values(f_dic, img):
print(f_dic)
for i in range(len(img)):
for j in range(len(img)):
vv = f_dic.get(img[i][j])
if vv != None:
img[i][j] = vv
return img
def histogramEqualization(img):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
freqq = freq(img)
area = img.shape
total_pixels = area[0]*area[1]
prob = probability(freqq, total_pixels)
f_dic = equalizer(prob,len(img))
new_img = replace_values(f_dic,img)
return new_img
pollen_dark = cv2.imread("/home/ahmed/Downloads/dip/DIP_A1_Fall2019/pollen_dark.tif")
new = histogramEqualization(pollen_dark)
plt.imshow(new, cmap='gray')
我正在得到这张图片:
输入图像是这个:
所需的输出图像是:。
使用NumPy执行此操作的一种方法是使用np.unique()
查找要修改的值,并使用np.linspace()
生成相应的正确值。整个想法在Wikipedia中用图片很好地描述了。与循环遍历数组相比,这通常是一种更干净的方法:
DEPTH = 2 ** 8
def hist_equalization(arr, depth=DEPTH):
vals = np.unique(arr)
new_vals = np.linspace(0, depth - 1, len(vals), dtype=int)
result = np.empty_like(arr)
for i, val in enumerate(vals):
result[np.nonzero(arr == val)] = new_vals[i]
return result
plt.imshow(arr, cmap='gray', vmin=0, vmax=DEPTH - 1)
plt.imshow(hist_equalization(arr), cmap='gray', vmin=0, vmax=DEPTH - 1)
输入:
输出:
(完整脚本可用here。]