Создание копии изображения через петлю не работает - PullRequest
0 голосов
/ 25 марта 2019

Ясно, почему код не будет работать. Все, что он делает, это дает мне чистое белое изображение. И если вы ранее не объявляли матрицу нулями (x, y), то она работает нормально. Что здесь не так?

Я пытался не объявлять матрицу нулей раньше, и только это работает. Я даже пытался сделать img2 (i, j) = img2 (i, j) + img1 (i, j)

function [imgOut] = scaleLoopBased(img,s)
%UNTITLED4 Summary of this function goes here
%   creating a zero matrix of the given scale
[rows,columns]=size(img);
imgTemp=zeros(rows, columns);

for i=1:rows
    for j=1:columns
        imgTemp(i, j) = img(i, j);
    end
end

imshow(imgTemp);

imgOut = imgTemp;
end

Пустое белое изображение

1 Ответ

1 голос
/ 25 марта 2019

Это результат того, что ваше новое изображение (типа double, которое zeros создает по умолчанию) не имеет тот же тип, что и исходное изображение (обычно тип uint8). Это можно исправить, инициализировав новое изображение так, чтобы оно имело тот же тип данных, что и исходный, используя функцию class и передав дополнительный аргумент zeros:

imgTemp = zeros(rows, columns, class(img));

Причина, по которой он работает правильно, когда вы не инициализируете imgTemp, заключается в том, что MATLAB инициализирует переменную для вас, используя тип данных img по умолчанию при выполнении первого индексированного присваивания.

Утилита imshow ожидает один из стандартных типов изображений в MATLAB . Предполагается, что изображение типа double будет иметь значения в диапазоне [0 1], а изображения типа uint8 будут иметь значения в диапазоне [0 255]. В вашем примере вы, вероятно, имеете матрицу imgTemp, которая имеет тип double, но имеет значения, охватывающие [0 255]. Еще один способ исправить вашу проблему - явно указать imshow, какой диапазон значений использовать для отображения (поскольку по умолчанию [0 1] не работает):

imshow(imgTemp, [0 255]);

Всегда помните о типе данных при манипулировании или обработке изображений. Возможно, вам придется масштабировать или конвертировать туда и обратно, используя тип double для вычислений (так как целые числа насыщаются) и тип uint8 для отображения и чтения / записи в файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...