2015-11-27 4 views
0

Мне было предоставлено условное изображение, и теперь мне нужно создать границы для изображения. Я решил, что ширина обеих моих черных и белых границ должна быть 25 пикселей каждый. Мой код ниже:Почему изображение не отображается правильно? MATLAB

%% Reading the Image in 
imdata = imread('image1.png'); 

%%Creating a new matrix for image3 
e_imdata = zeros(300,356); 

% First Rectangle of white 

for l = 25:331 
    for m = 25:50 
     e_imdata(m,l) = 255; 
    end 
end 

%% Second Rectangle of White 

for l = 25:331 
    for m = 250:275 
     e_imdata(m,l) = 255; 
    end 
end 


%% Third Rectangle of White 

for l = 25:50 
    for m = 50:250 
     e_imdata(m,l) = 255; 
    end 
end 

%% Fourth Rectangle of White 

for l = 306:331 
    for m = 50:250 
     e_imdata(m,l) = 255; 
    end 
end 

%% Copying the Actual Image in 

for l = 51:305 
    for m = 51:199 
     e_imdata(m,l) = imdata(m-50,l-50); 
    end 
end 

%% Final imsow 
    imshow(e_imdata); 

Я пытаюсь добавить каждую границу белого прямоугольника по одному. Это, конечно, успешно, но мой последний образ не выходит так, как я этого хочу.

Исходное изображение:

enter image description here

Мне нужно создать этот образ:

enter image description here

И я, кажется, получаю это изображение:

enter image description here

Вся помощь и предложения очень ценятся!

+1

Почему не 'e_imdata (26: 275, 26: 331) = 256;' установить белый кадр. Затем 'e_imdata (51: 199, 51: 305) = imdata;' для установки изображения. – zeeMonkeez

+0

@zeeMonkeez Это отличная идея, но это, безусловно, не решение моей проблемы. По крайней мере, я так не думаю! –

+1

Трудно сказать, что происходит, когда у нас нет фактического файла. Отображается ли исходное изображение в порядке с 'imshow'? – zeeMonkeez

ответ

1

Проблема заключается в том, что imshow() не масштабирует оттенки серого в правильном диапазоне. Вместо того, чтобы определить минимальное и максимальное значение в оттенках серого:

imshow(e_imdata, [0 255]); 

Или, конвертировать данные в Uint8

imshow(uint8(e_imdata)); 

Другой вопрос, в вашем коде является то, что вы не полностью скопировать образ более, поэтому вы все еще видите черный фон. Конечный цикл должен использовать следующие индексы:

%% Copying the Actual Image in 
for l = 51:306 
    for m = 51:250 
     e_imdata(m,l) = (imdata(m-50,l-50)); 
    end 
end 
+0

Я думал, что MATLAB уже знает, так как imshow (imdata) работает отлично. Я предполагаю, что свойство не переходит от исходного изображения к новой матрице. Ура! –

+1

Когда вы читаете в своем .png изображении, imdata имеет класс uint8, поэтому передача данных в imshow() работает так, как вы ожидали. Однако функция zeros(), которую вы используете для создания своей матрицы e_imdata, возвращает данные (нули) класса double по умолчанию. Когда вы копируете значения imdata в e_imdata, значения imdata затем преобразуются в double. Когда imshow(), наконец, вызывается с использованием этой матрицы с двойной точностью, он ожидает значений, масштабированных между 0.0 и 1.0, поэтому только небольшая часть исходного неудачного изображения является черным. – DMR

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