matlab中的局部直方图均衡化

时间:2017-03-25 06:55:33

标签: image matlab image-processing

我是matlab的新手。我想编写局部直方图均衡的代码。我已经编写了全局直方图均衡的代码,我知道局部均衡意味着对图像的每个部分进行单独均衡,但我的问题是我应该如何选择这部分图像?例如,我应该为与其他像素相邻的每100个像素进行均衡吗?换句话说,我如何将图像分割成某些部分然后对每个部分进行均衡?

1 个答案:

答案 0 :(得分:1)

最天真的做法是将图像分割成非重叠的块,在该块上执行全局直方图代码并将其保存到输出中。假设您将这些非重叠块的行和列定义为变量rowscols。在你的情况下,让我们说它是100 x 100,所以rows = 100; cols = 100;。您只需循环遍历每个非重叠块,进行直方图均衡,然后将其设置为输出中的相同位置。

如下所示,假设您的图片存储在im

rows = 100;
cols = 100;
out = zeros(size(im)); % Declare output variable

for ii = 1 : rows : size(im, 1)
    for jj = 1 : cols : size(im, 2)
        % Get the block
        row_begin = ii;
        row_end = min(size(im, 1), ii + rows);
        col_begin = jj;
        col_end = min(size(im, 2), jj + cols);
        blk = im(row_begin : row_end, col_begin : col_end, :);
        % Perform histogram equalization with the block stored in blk
        % ...

        % Assume the output of this is stored in O
        out(row_begin : row_end, col_begin : col_end, :) = O;
    end
end

请注意存储非重叠块的变量blk的复杂性。我们让开头的行和列只是循环计数器iijj,但是结束的行和列我们必须确保它受图像尺寸的限制。这就是min电话的原因所在。否则,结束行和列只是通过相应维度中块的大小添加的起始行和列。另请注意,如果您有彩色图片,我已使用:索引到第三维。灰度不应该影响此代码。在输出图像中存储输出时,最终需要使用相同的索引。请注意,我假设它存储在变量O中,这是您自定义直方图均衡功能的输出。

输出out将包含您的局部直方图均衡图像。请注意,如果您有图像处理工具箱中的blockproc,理论上可以在一行中执行此操作。这会处理图像中的不同块并对其应用某些功能。假设您的直方图均衡功能被称为hsteq,您只需执行此操作:

rows = 100; cols = 100;
out = blockproc(im, [rows, cols], @(s) hsteq(s.data));

第一个输入是您要处理的图像,第二个输入定义块大小,最后一个元素是您要应用于每个块的函数。请注意blockproc为您的函数提供了一个自定义结构,因此重要的是您在结构中提取data字段。这应该产生与上面代码相​​同的输出。