自适应直方图均衡化(AHE)算法

5
我一直在尝试找到执行全自适应直方图均衡化的算法(不使用插值)。但是,似乎我仍然缺少一些内容,无法得到正确的结果图像。
以下是我遵循的步骤,希望有人能够指出其中缺少了什么:
1. 输入灰度图像(0-255)。 2. 创建一个超大的图像,并在边界附近镜像值,以避免边界和角落的特殊情况。(如本文第20页所提出的:自适应直方图均衡化并行实现) 3. 为源图像中的每个像素初始化一个等级0。 4. 对于源图像中的每个像素,在其局部区域内查找其等级(局部区域大小将作为输入给出)。 像素等级是局部区域中小于中心像素(我们正在源图像上循环的像素)的像素数量。 5. 通过以下公式计算新像素值:Rank *(最大强度=255)/(局部区域中的像素数)
按照这些步骤进行操作,对于30x30局部区域窗口大小,会得到以下输出:
原始图像:

Original

输出:

Output

我希望在以下问题上得到指导,了解我在这里缺少了什么。


当我要在这里添加代码的一部分时,我最后一次在新的测试图像上尝试了一下,它奏效了。问题是上面的图像有两行不应该存在的灰色像素(使用剪贴工具获取图像时,可能将一些外部边框与其一起剪切)。上述算法完美地运行。 - Elia
你能否发布一些代码来展示你的实现方式?我正在尝试做类似的事情,但在尝试切割图像时遇到了瓶颈。 - user2808264
我正在尝试做类似的事情。您能否提供一些建议呢? 我已经在http://stackoverflow.com/questions/43580776/parallel-implementation-of-adaptive-histogram-equalization发布了我的问题。 - user2808264
1个回答

2
我们可以使用以下的python代码来实现上述的AHE算法,如果需要并行化版本,请参考这篇论文。这里的wsz是上下文窗口大小参数。
def AHE(im, wsz=8):    
    h, w = im.shape
    out = np.zeros(im.shape) # Declare output variable
    im = np.pad(im.copy(), ((wsz//2, wsz//2), (wsz//2, wsz//2)), mode = 'reflect')
    for x in range(wsz//2, h + wsz//2):
        for y in range(wsz//2, w + wsz//2):
            blk = im[x-wsz//2:x+wsz//2, y-wsz//2:y+wsz//2]
            rank = np.sum(im[x, y] > blk)
            out[x - wsz//2, y - wsz//2] = rank * 255 / wsz**2
    return out

并获得以下输出结果(使用wsz=50):

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接