【问题标题】:local histogram equalization in matlabmatlab中的局部直方图均衡
【发布时间】:2017-03-25 06:55:32
【问题描述】:

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

【问题讨论】:

标签: image matlab image-processing


【解决方案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 字段。这应该会产生与上面带有循环的代码相同的输出。

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多