Как мне реализовать алгоритм склеивания / прореживания Matlab на iPhone? - PullRequest
1 голос
/ 26 января 2011

Как я могу реализовать алгоритм Matlab, который будет скелетонизировать / тонкий двоичный файл (черный и белые) изображения в Objective-C в приложении для iPhone?

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Ну, в принципе, вы могли бы использовать морфологические операторы для этого ...

Создайте восемь таких операторов, как это:

      0 0 0
St1 = x 1 x  (for deleting upper pixels)
      1 1 1

поверните это 4 раза, чтобы получить его для 4 сторон. Затем также постройте еще 4 угла, как это:

      0 0 x
St5 = 0 1 1   (rotate this again 4 times for the 4 corners)
      x 1 1

Затем вы стираете свое изображение (с помощью петель), пока ни один из операторов больше не может быть использован ... остаётся скелет этого изображения ...

Это не должно быть слишком сложно для реализации в Objective C, я думаю ... (не знаком с этим) ... это общая стратегия ...

Надеюсь, это поможет ... если нет, продолжайте спрашивать ...; -)

0 голосов
/ 27 января 2011

EDIT:

Я написал фрагментный шейдер GLSL, который выполняет быструю скелетонизацию изображений. Вы можете применять этот шейдер в цикле, пока не получите то, что вам нужно. Код шейдера GLSL:

uniform sampler2D Texture0;
varying vec2 texCoord;

// 3x3 pixel window
// (-1,+1) (0,+1) (+1,+1)
// (-1,0)  (0,0)  (+1,0)
// (-1,-1) (0,-1) (+1,-1)

float dtex = 1.0 / float(textureSize(Texture0,0));  

vec4 pixel(int dx, int dy) { 
   return texture2D(Texture0,texCoord + 
                    vec2(float(dx)*dtex, float(dy)*dtex));
}

int exists(int dx, int dy) {
   return int(pixel(dx,dy).r < 0.5);
}

int neighbors() {
   return  exists(-1,+1) +
           exists(0,+1) +
           exists(+1,+1) +
           exists(-1,0) +
           exists(+1,0) +
           exists(-1,-1) +
           exists(0,-1) +
           exists(+1,-1);
}

int transitions() {
   return int(
          clamp(float(exists(-1,+1))-float(exists(0,+1)),0.,1.) +  // (-1,+1) -> (0,+1)
          clamp(float(exists(0,+1))-float(exists(+1,+1)),0.,1.) +  // (0,+1) -> (+1,+1)
          clamp(float(exists(+1,+1))-float(exists(+1,0)),0.,1.) +  // (+1,+1) -> (+1,0)
          clamp(float(exists(+1,0))-float(exists(+1,-1)),0.,1.) +  // (+1,0) -> (+1,-1)
          clamp(float(exists(+1,-1))-float(exists(0,-1)),0.,1.) +  // (+1,-1) -> (0,-1)
          clamp(float(exists(0,-1))-float(exists(-1,-1)),0.,1.) +  // (0,-1) -> (-1,-1)
          clamp(float(exists(-1,-1))-float(exists(-1,0)),0.,1.) +  // (-1,-1) -> (-1,0)
          clamp(float(exists(-1,0))-float(exists(-1,+1)),0.,1.)    // (-1,0) -> (-1,+1)          
          );
}

int MarkedForRemoval() {
   int neib = neighbors();
   int tran = transitions();

   if (exists(0,0)==0  // do not remove if already white
       || neib==0      // do not remove an isolated point
       || neib==1      // do not remove tip of a line
       || neib==7      // do not remove located in concavity
       || neib==8      // do not remove not a boundary point
       || tran>=2      // do not remove on a bridge connecting two or more edge pieces
       )
       return 0;
   else
      return 1;
}

void main(void)
{
    int remove = MarkedForRemoval();
    vec4 curr = texture2D(Texture0,texCoord);
    vec4 col = vec4(remove,remove,remove,1.0);
    gl_FragColor = (remove==1)? col:((curr.r > 0.05)? 
                                     vec4(1.0,1.0,1.0,1.0):curr);
}

Только этот временной код основан на этой лекции (фактически на первой части лекции, поэтому в алгоритме есть некоторые ошибки :-)) Посмотрите, что происходит, когда бедного шимпанзе постоянно кормят этим шейдером GLSL:

Итерация 0 enter image description here

Итерация 5 enter image description here

Итерация 10 enter image description here

Итерация 15 enter image description here

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