2016-10-08 2 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, либо 255s

Что я делаю неправильно?

ответ

4

Ваша проблема возникает, когда вы сохраняете изображение. Если вы check the description of imwrite, вы увидите, что если вы хотите сохранить изображение в виде двоичного файла, вы должны выбрать BMP, PNG или TIFF. Это форматы без потерь. 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

Вы не представляете, насколько я убивал свою голову, пробуя всевозможные леопы, и я понял после вашего кода, что проблема заключается в сохранении изображения в jpg ... любая идея, почему это происходит? –

Смежные вопросы