按照您的要求,最简单的方法是将图像拆分为不重叠的块,在该块上执行全局直方图代码并将其保存到输出中。假设您将这些非重叠块的行和列定义为变量rows 和cols。在你的情况下,假设它是 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 的复杂性,它存储了非重叠块。我们让开始的行和列简单地成为循环计数器ii 和jj,但结束行和列我们必须确保它受图像尺寸的限制。这就是min 电话存在的原因。否则,结束行和列只是在相应维度中添加块大小的开始行和列。另请注意,如果您有彩色图像,我已使用: 索引到第三维。灰度不应影响此代码。在将输出存储在输出图像中时,您最终需要使用相同的索引。请注意,我假设这存储在变量 O 中,这是您自定义的直方图均衡函数的输出。
输出out 将包含您的本地直方图均衡图像。请注意,如果您有图像处理工具箱中的blockproc,理论上您可以在一行中执行此操作。这会处理图像中的不同块并对其应用一些功能。假设您的直方图均衡函数称为hsteq,您只需这样做:
rows = 100; cols = 100;
out = blockproc(im, [rows, cols], @(s) hsteq(s.data));
第一个输入是您要处理的图像,第二个输入定义块大小,最后一个元素是您要应用于每个块的函数。请注意,blockproc 为您的函数提供了一个自定义结构,因此重要的是您在结构中拉出data 字段。这应该会产生与上面带有循环的代码相同的输出。