2016-10-08 39 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 ......任何想法为什么发生这种情况? –