wangqiuqiu_123 2020-04-16 09:56 采纳率: 0%
浏览 177

关于图像处理中直方图均衡化的一个问题

按照知乎上一篇文章的思路,构造了这样一个图片矩阵img,它总共有300个像素,其中100个灰度为50,100个灰度为51,100个灰度为52.
通过对整张图进行直方图均衡化处理,代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = np.array([50]*100 + [51]*100 + [52]*100)   
img = img.astype(np.uint8)    # 原图片矩阵

hist = cv2.calcHist([img], [0], None, [256], [0,256])

hists_cumsum = np.cumsum(hist) 
const_a = 256/300
hists_cdf = const_a * hists_cumsum
hists_cdf[hists_cdf>255] = 255
hists_cdf = hists_cdf.astype(np.uint8)

#mapping
img_eq = hists_cdf[img]       #整体直方图均衡化后的图矩阵

灰度为 50-> 85

51->170
52->255

但是用opencv自带的函数,进行处理后结果如下:

equ = cv2.equalizeHist(img)

灰度为 50->0
51->128
52->255

为什么会有这样的差异呢,但是看opencv的文档,这个函数也是整体上进行直方图均衡化处理呀。

请大神解答下

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-07-25 15:05
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据你提供的代码和描述,可以看出两种直方图均衡化的结果不一致的原因在于使用不同的方法计算映射关系。在你自己编写的代码中,通过计算累积分布函数的方式,将像素灰度值映射到0-255的范围内,而在opencv中,equalizeHist函数内部使用了另一种映射方式。 具体来说,opencv中的equalizeHist函数采用的是直方图均衡化的标准算法,该算法将原始图像中的像素灰度值映射到0-255范围内,确保输出图像中包含所有可能的灰度值并且分布均匀。这意味着在处理灰度分布不均匀的图像时,可能会出现一些像素灰度值被映射到同一个值的情况,导致亮度变化不够明显。 如果你希望获得自定义的映射结果,可以根据你的需求修改opencv的equalizeHist函数或者自己编写直方图均衡化的代码来实现。下面给出一个修改后的代码示例:
    import cv2
    import numpy as np
    img = np.array([50]*100 + [51]*100 + [52]*100)
    img = img.astype(np.uint8)
    hist = cv2.calcHist([img], [0], None, [256], [0,256])
    hists_cumsum = np.cumsum(hist)
    const_a = 256/300
    hists_cdf = const_a * hists_cumsum
    hists_cdf[hists_cdf > 255] = 255
    hists_cdf = hists_cdf.astype(np.uint8)
    # custom mapping
    mapping = {50: 85, 51: 170, 52: 255}
    img_eq_custom = np.vectorize(lambda x: mapping[x])(img)
    # using custom mapping instead
    equ_custom = img_eq_custom
    print("Custom Mapping Result:")
    print(equ_custom)
    # show the results
    plt.figure(figsize=(12, 6))
    plt.subplot(1, 2, 1)
    plt.hist(equ_custom.ravel(), bins=256, range=[0, 256])
    plt.title('Custom Mapping Result Histogram')
    plt.subplot(1, 2, 2)
    plt.hist(equ.ravel(), bins=256, range=[0, 256])
    plt.title('OpenCV equalizeHist Result Histogram')
    plt.show()
    

    通过以上代码示例,你可以自定义灰度值的映射关系,实现你期望的直方图均衡化结果。希望这个解答对你有帮助。如果有任何问题,请随时提出。

    评论

报告相同问题?