imshow显示相同矩阵的不同图像?

时间:2016-04-20 09:03:18

标签: octave

假设我想要反转图像的颜色,并编写了三个函数来实现这一目的。

negativea.m:

function [negative] = negativea (image)
    negative = 255 - image;
end

negativeb.m

function [negative] = negativeb (image)
    [rows, columns, channels] = size(image);

    negative = zeros(rows, columns, channels);

    for i = 1:rows
        for j = 1:columns
            for c = 1:channels
                negative(i, j, c) = 255 - image(i, j, c);
            end
        end
    end
end

negativec.m

function [negative] = negativec (image)
    [rows, columns, channels] = size(image);

    negative = image;

    for i = 1:rows
        for j = 1:columns
            for c = 1:channels
                negative(i, j, c) = 255 - image(i, j, c);
            end
        end
    end
end

显然a是八度音最快的。 b和c之间的唯一区别是negative的初始化,但存储的值永远不会在函数中读取,只能写入。不可思议的是,所有制作的图像都是相同的:

>> img = imread('logo.png');
>> nega = negativea(img);
>> negb = negativeb(img);
>> negc = negativec(img);
>> isequal(nega, negb) && isequal(negb, negc)
ans =  1

但是,在绘制图形中的所有图像时,未正确绘制b图像:

>> subplot(1,4,1); imshow(img);
>> subplot(1,4,2); imshow(nega);
>> subplot(1,4,3); imshow(negb);
>> subplot(1,4,4); imshow(negc);

给出此结果http://i.imgur.com/T7J4AEW.png b的颜色未正确反转。

现在我的问题非常简单。为什么呢?

P.S。:在Windows 10(x64)上使用octave 4.0.1

P.P.S。:也许八度音标的例子被严格选择,因为它有一个alpha通道。然而,由于通道数为3,alpha通道似乎被imread删除,而对于没有alpha通道的图像,我的问题完全相同。这似乎不会导致问题。

1 个答案:

答案 0 :(得分:0)

好的,结果表明数据类型应该受到指责:

>> class(nega)
ans = uint8
>> class(negb)
ans = double
>> class(negc)
ans = uint8

zeros()函数默认返回double类型的数组,而imread()返回uint8。其他图像函数期望整数的数据范围为0 ... 255,浮点数的范围为0.0 ... 1.0。因此,由负b产生的反转图像具有远远超出合理范围的大多数颜色值。要解决此问题,请在b:

中使用正确的数据类型进行初始化
negative = zeros(rows, columns, channels, 'uint8');

或将调色板转换为循环中的0.0 ... 1.0范围:

negative(i, j, c) = double(255 - image(i, j, c)) / double(255);