假设我想要反转图像的颜色,并编写了三个函数来实现这一目的。
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通道的图像,我的问题完全相同。这似乎不会导致问题。
答案 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);