2016-08-27 3 views
0

У меня есть следующий код RLSA в matlab. Суть этого алгоритма заключается в том, что он пытается подключить область с заданным интервалом (порогом), например, при определении текстовых областей (поскольку текст в основном фиксирован конкретный интервал в большинстве случаев на изображениях), он пытается присоединиться к ним, чтобы при выполнении некоторых морфологических операций они хорошо справлялись с определением этих областей.Алгоритм сглаживания длины (RLSA) в MATLAB

1.function result=RLSA(image,hor_thresh) 
2.  zeros_count=0; 
3.  one_flag=0; 
4.  hor_image=image; 
5.  [m,n]=size(image); 
6.  for i=1:m 
7.   for j=1:n 
8.    if(image(i,j)==1) 
9.     if(one_flag==1) 
10.      if(zeros_count<=hor_thresh) 
11.       hor_image(i,j-zeros_count:j-1)=1; 
12.      else 
13.       one_flag=0; 
14.      end 
15.      zeros_count=0; 
16.     end 
17.     one_flag=1; 
18.    else 
19.     if(one_flag==1) 
20.      zeros_count=zeros_count+1; 
21.     end 
22.    end 
23.   end 
24.  end 
25.  result= hor_image; 
26.  end 

выше MATLAB код был взят из следующих сайтов

answers.opencv.org

Attempt to implementation Running Length Smoothing Algorithm in C++

Более подробное описание здесь

Working of RLSA

Приведенный выше код не работает для всех порогового values.For например о вводе порогового значения = 20 я получил следующие ошибки

Subscript indices must either be real positive integers or logicals. 


Error in RLSA (line 11) 
        hor_image(i,j-zeros_count:j-1)=1; 

Может кто-нибудь объяснить мне работу алгоритма на изображениях с текстом и, почему этот код Безразлично Не работает ли для всех пороговых значений? Кроме того, мне нужно сделать два прохода (как описано в приведенных ссылках) этого кода, один для горизонтального и один для вертикального и логического, и они или упомянутый код уже позаботились об этом?

+0

Отладчик, вероятно, скажет вам, если вы установите точку останова в строке 11 и посмотрите значения 'j' и' zeros_count'. – beaker

ответ

1

Ну, все зависит от изображения, которое вы передаете вместе с Hor_Thresh. Я предполагаю, что проблема в том, что j-zeros_count может быть отрицательным. Это было бы возможно, если один столбец изображения имеет 1, но в пределах 20 пикселей другого столбца, который имеет 1. Тогда диапазон, который установлен в 1, будет охватывать 2 столбца.

Я действительно не знаю, что алгоритм пытается сделать, но он, похоже, имеет дело с двоичными изображениями (но не явно). Он устанавливает интервалы нулей (с пометкой на книги), которые считаются < Hor_Threshold, чтобы все были равны 1. Поэтому, если есть «короткие» прогоны нулей, они будут установлены в 1.

Угадайте имя параметр, я бы ожидал увидеть некоторый код возврата между циклами 2. Hor_Threshold подразумевает горизонтальный порог, то есть он получает сброс каждого столбца. Итак, между циклами i и j, я думаю, вам нужно сбросить два флага: zeros_count = 0; one_flag = 0;

Прошло много времени с тех пор, как я использовал Matlab, я использовал аналогичный язык, Игорь Про на некоторое время, поэтому я проверил вещи в Игоре. Это переведенная функция:

Function/Wave RLSA(image,hor_thresh) 
    Wave Image 
    Variable Hor_Thresh 

    Variable zeros_count = 0; 
    Variable one_flag = 0; 
    Duplicate/FREE Image, hor_image 
    Variable m = DimSize(Image,0) 
    Variable n = DimSize(Image,1) 
    Variable i, J 
    for (i = 0;i < m;i += 1) 
     for (j = 0;j < n;j += 1) 
      if (image[i][j] == 1) 
       if (one_flag == 1) 
        if (zeros_count <= hor_thresh) 
         hor_image[i][j-zeros_count,j-1] = 1; 
        else 
         one_flag = 0; 
        endif 
        zeros_count = 0; 
       endif 
       one_flag = 1; 
      else 
       if (one_flag == 1) 
        zeros_count += 1; 
       endif 
      endif 
     endfor 
    endfor 
    return hor_image; 
end //RLSA 

Igor, как и C++ - это индексирование с нулевым индексом. Так что я мог получить ту же ошибку с изображением, которое я создал:

Make/N=(24,24) Image 
Image = 0 
image[0][22] = 1 
image[1][2] = 1 
RLSA(image,20) 

Выдает ту же ошибку, как у вас есть. Итак, у меня есть 2 изображения, которые разделены 3 нулями (< второй аргумент), но находятся в разных столбцах.

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