我是matlab的新手。我想编写局部直方图均衡的代码。我已经编写了全局直方图均衡的代码,我知道局部均衡意味着对图像的每个部分进行单独均衡,但我的问题是我应该如何选择这部分图像?例如,我应该为与其他像素相邻的每100个像素进行均衡吗?换句话说,我如何将图像分割成某些部分然后对每个部分进行均衡?
答案 0 :(得分:1)
最天真的做法是将图像分割成非重叠的块,在该块上执行全局直方图代码并将其保存到输出中。假设您将这些非重叠块的行和列定义为变量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
字段。这应该产生与上面代码相同的输出。