C# Сравнение двух картинок

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by noxjoker, 6 Jun 2010.

  1. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Решил данный вопрос. Спс scrat.

    выходит такой результат 5-6 фпс.

    http://www.youtube.com/watch?v=vZfVflE0KlE
     
  2. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    с чего это ты взял, что попиксельно долго?
     
  3. Renji

    Renji Member

    Joined:
    5 Dec 2010
    Messages:
    24
    Likes Received:
    5
    Reputations:
    0
    Посмотрите в сторону нейронных сетей. (Здесь можно скачать качественные статьи: http://ifolder.ru/18957913).
    Есть также много способов сравнения (сам я о них узнал только что):
    1) "Сначала ищутся "Corellation points" — характерные "сильные" точки на картинке, которые всегда можно точно идентифицировать и по горизонтали и по вертикали. Потом по ним определяется трансформация между картинками (если в обоих изображениях нашлось достаточно corellation points. Трансформация — это сдвиг, зум и поворот. Потом по зтим результатам трансформируем одну из картинок и вычитаем одну из другой, анализируем результат в зависимости от допустимых изменения яркости и нассыщенности."
    2) "Как вариант — сделать предварительно Gaussian Blur, после чего считать корелляцию. Сигму конечно же надо подбирать экспериментально. А уже кандидатов проверять более строго. Blur делается довольно быстро, методом БИХ-фильтров, но есть и еще быстрее, типа stack blur. Но главная фишка в том, чтобы иметь быстрый кэш с уже заблюренными изображениями."
    3) "Как вариант — дарбулызуть спектральным анализом — предварительно сделать 2D FFT и отбирать возможные кандидаты в частотно-фазовом домене, после чего проверять более тщательно уже в пространственном домене. Это может сработать быстрее. Но может быть и медленнее — надо все проверять."
    4) "Разбить картинку на четыре части, вычислить центр масс для каждой части, прежде чем сравнивать картинки попиксельно сравнить центры масс для частей, если разница между массами меньше заданной погрешности то сравнивать попиксельно. В базе хранить центры масс частей для каждой картинки. Разбивать можно не только на 4 части, может и пополам хватит."
    5) "Картинки небольшие.
    Уподобим каждую картинку текстовой строке, то есть выложим ее в линию, и закодируем (условно говоря, делать не надо) буквами.
    Далее применить алгоритмы схожести текстовых строк.
    Идея в том, что сдвиг и ротация приведет к тому, что останутся те же "буквы", только немного сместятся их позиции, и критерий похожести будет большим."
    От себя добавлю:
    Это способы, конечно, лидируют, но, например, лично я не каждый смогу воспроизвести.
    Следует прочитать материалы "Вейвлеты в компьютерной графике", насколько мне известно - это самый распространенный способ сравнения изображений.
    Если задача позволяет использовать дебильW^простые и ресурсоёмкие механизмы, то советую разбить изображение на несколько частей, перевести формат изображения в любой другой понравившийся (будь то base64) и т.д.
     
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    посмотри в сторону библиотеки OpenCV, больше чем уверен, что для нее это пустяк, а код есть в примерах :)
     
    _________________________
  5. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    попахивает девелопом удаленного рабочего стола, поэтому, осмелясь это предположить, выкладываю довольно неплохие сорцы на чистом апи и с использованием программного сжатия ;)

    http://www.sendspace.com/file/gnj5oe
     
  6. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Corellation points на шарпе можно сделать.