gpt4 book ai didi

python - 直方图均衡:未获得所需的输出图像

转载 作者:行者123 更新时间:2023-12-02 17:27:15 28 4
gpt4 key购买 nike

我试图自己实现直方图均衡功能,但没有得到所需的输出图像。

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()查找要修改的值及其概率分布函数(pdf),该函数基本上是直方图。根据从pdf上np.cumsum()获得的累积分布函数(cdf),可使用以下公式生成相应的归一化值:
round((cdf - min_cdf) / (num_voxels - min_cdf) * (depth - 1))
整个概念(以及公式)在Wikipedia中得到了很好的图示说明。

与循环遍历数组相比,这通常是一种更干净的方法:

DEPTH = 2 ** 8


def hist_equalization(arr, depth=DEPTH):
vals, pdf = np.unique(arr, return_counts=True)
cdf = np.cumsum(pdf)
min_cdf = min(cdf)
new_vals = (
np.round((cdf - min_cdf) / (arr.size - min_cdf) * (depth - 1))
.astype(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)

输入:

img_input

输出:

img_output

(完整脚本可用 here。请注意,为了方便起见,我使用 PIL而不是 cv进行I / O,但这与问题无关。)

编辑

在您的代码中到处都是小故障(有些不太严重,有些更严重),但是阻碍您获得正确结果的是 equalizer()本质上是错误的。

如果您将 equalizer()版本替换为:
def equalizer(pdf, l, depth=2 ** 8):
min_cdf = pdf[min(pdf)]
result = {}
accumulator = 0
for k, v in sorted(pdf.items()):
accumulator += v
result[k] = int(round((accumulator - min_cdf) / (l - min_cdf) * (depth - 1)))
return result

被称为:
f_dic = equalizer(freqq, total_pixels)

然后,其余的代码应该可以工作。
请注意, probability()完全没有必要,您确实需要 total_pixels(或 img.size),因为应用于N维数组的 len(img)将沿第0维给出长度 ,而不是像素总数。

(这也包括here。)

关于python - 直方图均衡:未获得所需的输出图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58433683/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com