下面是我使用的代码:
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乘以每幅图像,我可以看到更多的帧。那么,一定是与正常化有关吧?
发布于 2017-09-25 02:14:54
有两个可能的问题:
Lab组件添加过滤器,这样在迭代k时,您已经将从1到k的所有过滤器应用到它们。这将持续地降低你的图像值的幅度,使它们变得足够小,当添加到蒙太奇中时,较小的值图像似乎有很小的动态范围,只是显示为黑色。
我猜您希望只在迭代k中应用筛选器k,而不是以前所有的。如果是这样的话,您应该将循环代码更改为:
对于k=1:长度(FilterBank) Lk = imfilter(L,filterBank{k},‘同’,'conv',‘复制’);filterResponses(:,:,k*3-2) = Lk;ak = imfilter(a,filterBank{k},'same','conv',‘filterResponses’);filterResponses(:,:,k*3-1) = ak;bk = imfilter(b,filterBank{k},‘同’,'conv',‘复制’);filterResponses(:,:,k*3) = bk;结束https://stackoverflow.com/questions/46396042
复制相似问题