Image matlab中的局部直方图均衡化

Image matlab中的局部直方图均衡化,image,matlab,image-processing,Image,Matlab,Image Processing,我对matlab很陌生。我想写局部直方图均衡化的代码。我已经为全局直方图均衡化编写了代码,我知道局部均衡化意味着分别对图像的每个部分进行均衡化,但我的问题是,我应该如何选择这部分图像?例如,我应该为每100个相邻像素进行均衡吗?换句话说,我如何将图像分割成一些部分,然后对每个部分进行均衡化?最简单的方法是将图像分割成不重叠的块,在该块上进行全局直方图编码,并将其保存到输出。假设您将这些非重叠块的行和列定义为变量rows和cols。在你的例子中,假设它是100x100,所以rows=100;col

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

最简单的方法是将图像分割成不重叠的块,在该块上进行全局直方图编码,并将其保存到输出。假设您将这些非重叠块的行和列定义为变量
rows
cols
。在你的例子中,假设它是100x100,所以
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
的复杂性。我们让开始的行和列只是循环计数器
ii
jj
,但结束的行和列必须确保它受图像的尺寸限制。这就是为什么有
min
调用。否则,结束的行和列只是由相应标注中块的大小添加的开始行和列。还请注意,我使用了
索引到第三维,以防您有彩色图像。灰度不应影响此代码。最后,在输出图像中存储输出时,需要使用相同的索引。注意,我假设它存储在变量
O
中,该变量是自定义直方图均衡函数的输出

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

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

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

阅读以下内容:@Rotem感谢您的回答