首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要在这个蒙太奇图像中得到黑框?

为什么我要在这个蒙太奇图像中得到黑框?
EN

Stack Overflow用户
提问于 2017-09-25 00:17:25
回答 1查看 147关注 0票数 1

下面是我使用的代码:

代码语言:javascript
复制
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个过滤器中应用一个过滤器。

下面的脚本用于执行函数:

代码语言:javascript
复制
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乘以每幅图像,我可以看到更多的帧。那么,一定是与正常化有关吧?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-25 02:14:54

有两个可能的问题:

  • 您是按顺序向Lab组件添加过滤器,这样在迭代k时,您已经将从1k的所有过滤器应用到它们。这将持续地降低你的图像值的幅度,使它们变得足够小,当添加到蒙太奇中时,较小的值图像似乎有很小的动态范围,只是显示为黑色。 我猜您希望只在迭代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;结束
  • 在不知道确切的输入图像是什么的情况下,我看到了这条缩放图像值的特定行可能存在的问题: img = img./255; 您没有首先检查输入中的值范围。如果输入图像已经从0缩放到1,这将把最大振幅降低到比1小得多的值。如上所述,重复应用过滤器可能会使值变得足够小,当添加到蒙太奇时,较小的值图像的动态范围似乎很小,只是显示为黑色。 我建议检查输入图像的范围并在此基础上进行缩放。一种选择是按其自身的最大值缩放图像,使其结果范围为0到1: img = img./max(img(:));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46396042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档