0

我有图像和矢量

a = imread('Lena.tiff');
v = [0,2,5,8,10,12,15,20,25];

还有这个 M 文件

function y = Funks(I, gama, c)
[m n] = size(I);
for i=1:m
    for j=1:n
        J(i, j) = (I(i, j) ^ gama) * c;
    end
end
y = J;
imshow(y);

当我尝试这样做时:

f = Funks(a,v,2)

我收到此错误:

??? Error using ==> mpower
Integers can only be combined with integers of the same class, or scalar doubles.

Error in ==> Funks at 5
        J(i, j) = (I(i, j) ^ gama) * c;

有人可以帮我吗?

4

3 回答 3

0

There are two ways I would follow:

1) arrayfun

results = arrayfun(@(i) I(:).^gama(i)*c,1:numel(gama),'UniformOutput',false);
J = cellfun(@(x) reshape(x,size(I)),results,'UniformOutput',false);

2) bsxfun

results = bsxfun(@power,I(:),gama)*c;
results = num2cell(results,1);
J = cellfun(@(x) reshape(x,size(I)),results,'UniformOutput',false);
于 2013-04-16T21:03:52.107 回答
0

您尝试做的事情在数学上毫无意义。您正在尝试将vector分配给number。您的问题不在于 MATLAB 编程,而在于您要尝试做的事情的定义。

如果您尝试生成多个图像J,每个图像对应于gamma应用到图像的某个图像,您应该按以下方式进行操作:

function J = Funks(I, gama, c)
[m n] = size(I);

% get the number of images to produce
k = length(gama);

% Pre-allocate the output
J = zeros(m,n,k);

for i=1:m
    for j=1:n
        J(i, j, :) = (I(i, j) .^ gama) * c;
    end
end

最后你会得到图像J(:,:,1)J(:,:,2)等等。

如果这不是您想要做的,请先弄清楚您的方程式。

于 2013-04-16T20:33:52.830 回答
0

该错误是由于您试图将数字提高到矢量幂而引起的。翻译后(即用函数调用中的实际参数替换形式参数),它将类似于:

J(i, j) = (a(i, j) ^ [0,2,5,8,10,12,15,20,25]) * 2

Element-wise power.^也不起作用,因为您将尝试将向量“卡”到标量容器中。

稍后编辑:如果您想将每个伽玛应用于您的图像,也许这个循环更直观(虽然不是最有效的):

a = imread('Lena.tiff');        % Pics or GTFO
v = [0,2,5,8,10,12,15,20,25];   % Gamma (ar)ray -- this will burn any picture

f = cell(1, numel(v));  % Prepare container for your results

for k=1:numel(v)
    f{k} = Funks(a, v(k), 2);  % Save result from your function
end;
% (Afterwards you use cell array f for further processing)

或者您可以查看此处发布的其他(如果可能不是更清晰,则更有效)解决方案。

后来(呃?)编辑:如果您的 tiff 文件是 CYMK,则结果imreadMxNx4颜色矩阵,必须以不同于通常的方式处理(因为它是 3 维的)。

于 2013-04-16T20:09:53.063 回答