2016-04-20 68 views
0

比方說,我想要反轉圖像的顏色,並寫了三個函數來完成此操作。imshow顯示等矩陣的不同圖像?

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 

顯然,一個是最快的八度。 b和c之間的唯一區別是negative的初始化,但存儲的值從不在函數中讀取,只寫入。 Unsuprisingly,所有產生的圖像是相等的:

>> 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(64)

P.P.S:八度標誌也許示例使用八度4.0.1被嚴重選擇,因爲它有一個alpha通道。然而,Alpha通道似乎被刪除了imread,因爲通道數量是3,並且對於沒有Alpha通道的圖像我有完全相同的問題。這似乎不會導致問題。

+1

看看函數[' (http://octave.sourceforge.net/image/function/imcomplement.html),而不是自己寫(或者至少看看它看看如何以最有效的方式做到這一點)。 – carandraug

回答

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);