2016-10-08 65 views
1

我試圖做一個功能的圖像,這將給予灰度圖像,它會根據設置的閾值化的。我一整天都在這裏,但沒有成功。二值化所需的閾值

這是我實施的代碼。圖像是一個特定的圖像;不是一個變量。

function [ output_args ] = thresholdImg(X) 
A=imread('car_gray.jpg'); 
B=zeros(size(A,1),size(A,2)); 
for l=1:size(A,1) 
    for m=1:size(A,2) 
     if(sum(A(l,m,:))>X) 
      B(l,m)=1; 
     end 
    end 
end 
B=logical(B); 
figure,imshow(B); 

我不想用imbinarize。我希望這是手動執行的,代碼要儘可能簡單。圖像的輸出看起來是二進制的,但是當你打印的矩陣,您會看到該值不僅是0和1或255秒

我在做什麼錯?

回答

4

保存圖像時出現問題。如果您check the description of imwrite,你會看到,如果你想保存爲二進制圖像,你應該選擇BMPPNGTIFF。這些是無損格式。 JPEG另一方面是lossy compression format

另外,我做你的代碼非常緊湊,按照Adriaan's answer

function [] = thresholdImg(X) 
A=imread('car_gray.jpg'); 
B = sum(A, 3) > X 
figure,imshow(B); 
5

這將會是更快地擺脫循環完全的:

function [] = thresholdImg(X) 
A=imread('car_gray.jpg'); 
tmp=sum(A,3); % sum along the third dimension 
B = zeros(size(tmp)); 
B(tmp>X) = 1; % Set all values above the threshold to be one 
B=logical(B); 
figure,imshow(B); 

使用以下條件:A = rand(100,100,3);X=0.6;我們得到了這樣的畫面:

enter image description here

我們看到,這確實是,正如我們所料,完全是二元的。此外,您還可以通過調用whos B,它告訴我們B確實logical型的,因此只有零和的檢查。

whos B 
    Name  Size    Bytes Class  Attributes 

    B   100x100   10000 logical  
+0

什麼可能我是做錯了什麼?將該循環的結果和顯示的功能保存爲jpg文件後,再讀取它,矩陣不是二進制的。問題是什麼? –

+0

@RyneIgnelzy你應該在問題陳述中告訴我們。您的問題顯然不在您向我們展示的代碼中,而是以jpg格式保存。保存,而不是bmp或png(tiff可以工作,但有點矯枉過正)。 – Adriaan

+0

你不知道有多少我正在嘗試各種不同的looops,我意識到你的代碼後,這個問題似乎是將圖像保存爲jpg ......任何想法爲什麼發生這種情況? –