这是我正在使用的代码:
function [filterResponses] = extractFilterResponses(img, filterBank)
% Extract filter responses for the given image.
% Inputs:
% img: a 3-channel RGB image with width W and height H
% filterBank: a cell array of N filters
% Outputs:
% filterResponses: a W x H x N*3 matrix of filter responses
if (~isa(img, 'double'))
img = double(img);
end
if (size(img, 3) == 1)
img = repmat(img, [1 1 3]);
end
img = img./255;
[L, a, b] = RGB2Lab(img(:, :, 1), img(:, :, 2), img(:, :, 3));
filterResponses = zeros(size(img,1), size(img, 2), length(filterBank)*3);
for k = 1:length(filterBank)
L = imfilter(L, filterBank{k}, 'same', 'conv', 'replicate');
filterResponses(:, :, k*3-2) = L;
a = imfilter(a, filterBank{k}, 'same', 'conv', 'replicate');
filterResponses(:, :, k*3-1) = a;
b = imfilter(b, filterBank{k}, 'same', 'conv', 'replicate');
filterResponses(:, :, k*3) = b;
end
end
上述函数在给定RGB图像的每个L * a * b图层上从一组20个滤镜中一次应用一个滤镜。
以下脚本用于执行该功能:
img = imread('sun_advbapyfkehgemjf.jpg');
filterBank = createFilterBank();
filteredImg = extractFilterResponses(img, filterBank);
filteredImgCell = cell(20,1);
for k = 1:length(filterBank)
filteredImgCell{k} = cat(3, filteredImg(:, :, k*3-2), filteredImg(:, :, k*3-1), ...
filteredImg(:, :, k*3));
filteredImgCell{k} = repmat(filteredImgCell{k}, [1 1 1 1]);
end
montage(cat(4, filteredImgCell{:}), 'size', [4 5]);
此脚本连接矩阵filterResponses
中的L * a * b图层,然后重新映射图像以添加要在蒙太奇函数中使用的第四维并存储在单元格中。该单元用于蒙太奇功能。
我得到的输出如下:
为什么其余的框架显示为黑色?我知道他们在那里,如果我将每个图像乘以10,我可以看到更多的帧。那么,必须与规范化有关吗?
答案 0 :(得分:3)
有两个可能的问题:
您正在将顺序过滤器添加到Lab
组件,以便在迭代k
您已应用所有从1
到k
的过滤器。这将不断降低图像值的幅度,使其变得足够小,当添加到蒙太奇时,较小值的图像似乎具有非常小的动态范围并且只显示为黑色。
我猜你想在迭代k
上应用只过滤器k
,而不是之前的所有过滤器。如果是这样,您应该将循环代码更改为以下内容:
for k = 1:length(filterBank)
Lk = imfilter(L, filterBank{k}, 'same', 'conv', 'replicate');
filterResponses(:, :, k*3-2) = Lk;
ak = imfilter(a, filterBank{k}, 'same', 'conv', 'replicate');
filterResponses(:, :, k*3-1) = ak;
bk = imfilter(b, filterBank{k}, 'same', 'conv', 'replicate');
filterResponses(:, :, k*3) = bk;
end
在不知道确切的输入图像是什么的情况下,我发现这个特定线的一个潜在问题是缩放图像值:
img = img./255;
您不是先检查输入中的值范围。如果输入图像已经从0缩放到1,这会将最大振幅减小到远小于1的值。如上所述,重复应用滤波器可能会导致值变小, ,当添加到蒙太奇时,较小值的图像似乎具有非常小的动态范围,只是显示为黑色。
我建议检查输入图像的范围并根据它进行缩放。一种选择是按照自己的最大值缩放图像,得到0到1的结果范围:
img = img./max(img(:));