Почему моя двоичная функция расширения изображения не работает должным образом? - PullRequest
3 голосов
/ 25 февраля 2012

У меня какие-то проблемы, так как я новичок в концепции анализа изображений и в инструменте Matlab.То, что я имею в виду, не работает как строки кода.

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

Это моя главная страница:

I = imread('logo_XXXX.png');
binaryImage = im2bw(I, 0.4);
s = ones(3,3,'int8');
i = dilate(binaryImage,s);
figure, imshow(i);

Это функция dlate.m:

function [i] = dilate(I,s)
[Irows,Icols] = size(I);
i=I;
Itemp = I;
for row=1:Irows
    for col=1:Icols
        x = intersectAt(Itemp,s,row,col);
        if x == 1
            i(row,col)=1;
        else
            i(row,col)=0;
        end
    end
end

И это istersectAt.m function:

function [i] = intersectAt(I,s,row,col)
[Srows,Scols] = size(s);
[Irows,Icols] = size(I);
i=0;
rowx = row - int8(Srows/2);
colx = col - int8(Scols/2);

for r=1:Srows
    for c=1:Scols
        if rowx+r <= 0 || rowx+r > Irows || colx+c <= 0 || colx+c > Icols
            continue;
        elseif I(rowx+r,colx+c) == 1 && s(r,c)==1
            i = 1;
        end
    end
end

Эти коды должны расширять это изображение:

enter image description here

однако, в какой-то момент он не работает должным образом:

enter image description here

Если вы поможете мне исправить мой код, я буду признателен.Если вы хотите узнать о расширении, вы можете следовать этому URL: http://www.mathworks.com/help/toolbox/images/f18-12508.html

Matlab имеет эту функцию в своей библиотеке, но мне нужно реализовать свою собственную функцию.

Ответы [ 3 ]

4 голосов
/ 25 февраля 2012

Вам следует избегать циклов как можно больше в matlab.

Если вам нужно написать собственную функцию, просто выполните:

s=ones(3);
i=(conv2(double(binaryImage),s,'same')>0)

Из вашего примера:

enter image description here

Я могу получить:

enter image description here

3 голосов
/ 26 февраля 2012

Тогда я дам подсказку. Спросите себя, что именно int8() делает для числа, большего 127. Кстати, номер индекса столбца, после которого ваш алгоритм начинает вести себя странно.

Изменить, чтобы уточнить

Если вы вычли номер типа int8 из другого, в этом случае double, Matlab автоматически преобразуется в int8. Например:

test = double(140) - int8(3)

Даёт 127.

1 голос
/ 26 февраля 2012

Я предполагаю, что imdlate реализован с conv2, но ваш код был бы более читабельным, если бы вы использовали это:

b = imdilate(bwImage,ones(3));

Before After

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