Проблема с добавлением двух элементов в MATLAB - PullRequest
1 голос
/ 30 мая 2020

Пытаюсь написать функцию для размытия изображений. (Мне известна команда imfilter . Просто пытаюсь реализовать ее по-своему). У меня есть следующая функция, которая принимает в качестве аргумента матрицу uint8 img .

function output=bl(img,w)
row=size(img,1);
col=size(img,2);
g_size=(2*w+1)^2;
output=uint8(zeros(row,col));
for ii=1:row
    for jj=1:col
        s=0;
        corner=[ii jj]-w;
        for r=corner(1):(corner(1)+(2*w))
            for c=corner(2):(corner(2)+(2*w))
                if((r>0 && r<=row) && (c>0 && c<=col))
                    s=s+img(r,c); %PROBLEMATIC LINE
                    fprintf('The value of s is %d\n',s);
                end
            end
        end     
        m=s/g_size;
        output(ii,jj)=fix(m);
        s=0;
    end
end
end

У меня проблемы со строкой, отмеченной как «ПРОБЛЕМА * 1013. * ЛИНИЯ". Строка кода должна была добавить предыдущее значение s с img (c, r). Но, что удивительно, каждый раз при запуске строки предыдущее значение s становится равным 0. Что я здесь делаю не так? Как я могу это решить?

1 Ответ

1 голос
/ 30 мая 2020

Проблема в том, что ваша проблема c строка приводит результат к uint8. Если вы добавляете все больше и больше целых чисел, вы в конечном итоге превысите предельное значение 255 (больше не может быть представлено 8 битами). См .:

s = 0 % s = 0; class double
s = s + uint8(200) % s = 200; class uint8
s = s + uint8(200) % s = 255; class uint8

Причина в том, что MATLAB не может добавлять другие типы, поэтому он неявно приводит свой тип по умолчанию double к unit8. Вы увидите, что это не удается, если вы инициализируете s как определенный тип, отличный от double

s = uint16(0);
s = s + uint8(200) % this will produce an error

Ошибка с использованием +
Целые числа могут быть только в сочетании с целыми числами того же класса или скалярными числами. может представлять с ним числа до 2^16-1 = 65535.

...