Что не так с этим простым кодом Matlab?

У меня есть сегментированное изображение «а» подписи, сделанное цветной ручкой. Фон чисто белый. Мне нужно вычислить сумму компонентов r g b пикселей переднего плана и общее количество пикселей, составляющих передний план. Вот мой код-

r=a(:,:,1);
g=a(:,:,2);
b=a(:,:,3);
rsum=0;
gsum=0;
bsum=0;
count=0;
for i=1:h
    for j=1:w
        if r(i,j)~=255 || g(i,j)~=255 || b(i,j)~=255
            rsum=rsum + r(i,j);   
            gsum=gsum + g(i,j);
            bsum=bsum + b(i,j);
            count=count+1; 
        end
    end
end

Он правильно вычисляет значение count, но все rsum,gsum,bsum установлены на 255, что явно неверно. Матрица r,g,b верна (показывает пиксели, отличные от 255). Почему не работает?


person user1727119    schedule 05.06.2014    source источник
comment
старайтесь избегать циклов, если это вообще возможно. Matlab мощен при работе с изображениями.   -  person Russell Uhl    schedule 05.06.2014
comment
спасибо, я новичок в Matlab и обработке изображений. переходя с фона c, трудно оставить петли: P   -  person user1727119    schedule 05.06.2014
comment
Я слышу это. Я был навязан Matlab для класса и был полностью потерян. Это совершенно новый и другой стиль программирования для людей, привыкших к C-подобным языкам.   -  person Russell Uhl    schedule 05.06.2014


Ответы (1)


Кажется, что type из rsum, gsum и bsum равно uint8 и насыщено на уровне 255. Попробуйте явно привести сумму к другому типу.

msk = r < 255 | g < 255 | b < 255;
rsum = sum( double( r(msk) ) );
gsum = sum( double( g(msk) ) );
bsum = sum( double( b(msk) ) );
count = sum(msk(:));

PS,
Лучше не использовать i и j в качестве переменных имена в Matlab.

person Shai    schedule 05.06.2014