2012-02-25 6 views
3

У меня возникла проблема, так как я новичок в анализе изображений и инструменте Matlab. То, что у меня на уме, не так хорошо работает, как строки кодов.Почему моя функция бинарного изображения не работает должным образом?

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

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

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

Это dilate.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 [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

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

enter image description here

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

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

ответ

3

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

Редактировать, чтобы уточнить

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

test = double(140) - int8(3) 

Дает 127.

+0

хорошая точка, но матрица s - это [3,3] размерная матрица. –

+0

Смотрите новое редактирование, удачи. – Maurits

+0

:) Кажется логичным. Что я должен сделать, чтобы решить эту проблему? –

4

Вы должны избегать петель как можно больше в Matlab.

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

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

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

enter image description here

можно получить:

enter image description here

+0

что на самом деле это утверждение делать? можете ли вы дать краткую информацию? Я буду рад. –

+0

ОК, я изменил свой ответ. – Oli

+1

Выполняет свертку с фильтром 's'. А затем возьмите все значения выше нуля. – Oli

1

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

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

Before After

+0

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

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