Поиск изображения по образцу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Hwma, 3 Sep 2009.

  1. Hwma

    Hwma New Member

    Joined:
    7 Jul 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Помогите пожалуйста составить алгоритм поиска изображения в изображении. Есть изображение (картинка) и есть образец другого изображения, который может присутствовать на исходном изображении. Каким образом можно найти этот образец на изображении? Придумал пока только такой вариант, что из образца возьму одну строчку шириной в 1 пиксель и буду попиксельно читать исходное изображение в поисках этой строчки. А как найти прямоугольник?
     
  2. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    нейросети, детка
     
  3. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Для чего тебе такой алгоритм? Если для распознания капчи то тебе в сторону скелетизации изображения копать надо...
     
  4. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Можно попробовать представить секцию в Image в файле bmp в виде матрицы и искомое изображение тоже. Далее блоками сравнивать и сдвигать.
     
  5. AKYLA

    AKYLA Elder - Старейшина

    Joined:
    29 Nov 2007
    Messages:
    108
    Likes Received:
    35
    Reputations:
    6
    На PHP что-то подобное есть
    http://habrahabr.ru/blogs/php/55926/

    А вообще нейросети конечно нужно, если что посложнее.

    Вот кусок на делфи, с какой-то проги, там по базе с фотками сравнивается картинка которую ты подсовываешь:

    Code:
    Procedure CompareBitmap(Const BitmapA, BitmapB:  TBitmap;
                               VAR Total, Sim, Diff:  Integer);
    // Total:total des pixel, Sim:Pixels similaires, Diff:Pixels dirrfents
        Type
    
          TRGBTripleArray =  ARRAY[WORD] OF TRGBTriple;
          pRGBTripleArray =  ^TRGBTripleArray;
    
        Var
          i   :  INTEGER;
          j   :  INTEGER;
          RowA:  pRGBTripleArray;
          RowB:  pRGBTripleArray;
    
      begin
    
        Assert( (BitmapA.width  = BitmapB.width) AND
                (BitmapA.height = BitmapB.height),  'Different sizes');
    
    
        BitmapA.PixelFormat := pf24bit;
        BitmapB.PixelFormat := pf24bit;
    
        Total  := BitmapA.width * BitmapA.height;
    
        SIM  := 0;
    
        Diff := 0;
    
        For j := 0 to BitmapA.Height-1 do
        begin
          RowA := BitmapA.Scanline[j];
          RowB := BitmapB.Scanline[j];
    // pour i do 0 jusqu' la largeur de BitmapA alors
          For i := 0 to BitmapA.Width-1 DO
          begin
    
    
    
            If   RowA[i] = RowB[i] Then
    
            inc(Sim)
    
            else inc(Diff)
    
    
          End
    
        End
    end;
     
    #5 AKYLA, 4 Sep 2009
    Last edited: 4 Sep 2009
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    совет - копай в сторону OpenCV
     
    _________________________
  7. imbd852

    imbd852 Banned

    Joined:
    4 Sep 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    -5
  8. Hwma

    Hwma New Member

    Joined:
    7 Jul 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Придумал такой алгоритм, берется первая строчка пикселов изображения, которое ищем, построчно в исходном изображении ищем ету строчку, как только нашли, вырезаем из исходного изображения прямоугольник с размерами искомого изображения и левым верхним углом начинающимся в начале найденной пиксельной строки, ну и затем сравниваем два етих прямоугольника.