2016-05-11 6 views
0

Есть ли алгоритм, который может принимать одно изображение в качестве входа и список изображений в качестве второго входа и указать, какой из них наиболее схожий? В нашей проблеме у нас могут быть образы, которые выглядят одинаково по сравнению с водяными знаками. Поэтому нам нужно будет определить совпадающие изображения, даже если водяные знаки разные.Алгоритм сравнения изображений для поиска наиболее похожих изображений в наборе

Нейронные сети, используемые для этого? Есть ли определенный алгоритм?

ответ

2

Выделение и согласование ключевых точек является одним из решений этой проблемы. Использование детектора функции как SIFT, SURF, Fast-To-Track, ... для извлечения ключевых точек на исходное изображение и другие изображения. В эти дни детектор SIFT стал популярным и был значительно улучшен благодаря его точности и эффективности.

После этого, особенности сочетаются с RANSAC алгоритмом или другими ...

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

Может см Keypoint алгоритм в OpenCV: API: http://docs.opencv.org/2.4/modules/refman.html Пример: http://docs.opencv.org/2.4/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.html#table-of-content-feature2d

1
  • Одним из возможных подходов является перцептивного хеширование, что является достаточно надежным и может быть настроена. Survey paper link

  • Конечно, это также можно сделать с помощью Deep Learning, но для этого потребуется гораздо больше работы. Slides

Это будет необходимо для определения вашей проблемы. Имеются ли пиксельные результаты (даже классическое хэширование на работе с пикселями); существуют различные сжатия (необходима устойчивость); есть ли цветовые преобразования или даже геометрические преобразования (например, вращения); размер-изменения ... Классические алгоритмы восприятия-хэширования довольно надежны даже для умеренных преобразований.

Некоторое время назад i implemented - простой пример хеша перцептуального кадра (основанный на пиксельной статистике, а не на характеристиках). Я бы попробовал что-то подобное, прежде чем «идти глубже» (CNN) :-)

Существует также вопрос о процессе запроса. Хотя я не помню хэширующие свойства моего подхода (возможно, метрика для бит-ошибок достаточно), Deep-Learning в Слайдах пытается сохранить сходства, чтобы вы могли получать расстояния/ранжирование во время запросов.

0

Самый простой подход - это регистрация (выравнивание) (регистрация ECC присутствует как для Matlab, так и для OpenCV), вы можете разработать свои собственные способы создания схемы для этого.

Улучшенный подход будет использовать функции MSER или FAST, присутствующие в Matlab. Используйте свою документацию, они буквально делают то, что вы просите.

PS: В Matlab 2015b встроен каскадный тренажер, который выполняет именно то, что вы просите. Принимает эталонное изображение, задает для фона без эталонного изображения и WALLA вы получили йо собственный каскадный классификатор готов использовать его на досуге, чтобы классифицировать изображения слева и справа, сбоку и снизу, сын.

0

Если вы хотите справиться с атакой водяного знака, я порекомендую вам алгоритмы хеша изображения, они быстры и прочны для такого рода нападений.Позвольте мне показать вам некоторые примеры

origin 00watermark 00 origin 01watermark 01 origin 02watermark 02 origin 03watermark 03

#include <opencv2/core.hpp> 
#include <opencv2/core/ocl.hpp> 
#include <opencv2/highgui.hpp> 
#include <opencv2/img_hash.hpp> 
#include <opencv2/imgproc.hpp> 

#include <iostream>  

void watermark_attack(cv::Ptr<cv::img_hash::ImgHashBase> algo) 
{ 
    std::vector<std::string> const origin_img 
    { 
     "origin_00.png", "origin_01.png", 
     "origin_02.png", "origin_03.png" 
    }; 
    std::vector<std::string> const watermark_img 
    { 
     "watermark_00.png", "watermark_01.png", 
     "watermark_02.png", "watermark_03.png" 
    }; 

    cv::Mat origin_hash, watermark_hash; 
    for(size_t i = 0; i != origin_img.size(); ++i){ 
     cv::Mat const input = cv::imread(origin_img[i]); 
     cv::Mat const watermark_input = cv::imread(watermark_img[i]); 
     //compute the hash value of image without watermark 
     algo->compute(input, origin_hash); 
     //compute the hash value of image with watermark 
     algo->compute(watermark_input, watermark_hash); 
     //compare the different between the hash values 
     //of original image and watermark image 
     std::cout<<algo->compare(origin_hash, watermark_hash) 
       <<std::endl; 
    }  
} 

int main() 
{ 
    using namespace cv::img_hash; 

    //disable opencl acceleration may(or may not) boost up speed of img_hash 
    cv::ocl::setUseOpenCL(false); 

    watermark_attack(AverageHash::create());   
} 

Результаты 1,2,1,2, все пас.

Эта небольшая программа сравнивает исходное изображение (слева) со своим братом водяного знака (справа), чем меньше значение вычисления, тем более похожи изображения. Для случая AverageHash рекомендуем пороговое значение 5 (это означает, что если результат сравнения больше 5, изображения считаются очень разными).

Не только водяной знак, AverageHash предоставляют другие «побочные эффекты», этот алгоритм работает под контрастом, шум (гауссовский, перец и соль), а также изменение размера и jpeg-сжатия.

Другое преимущество использования хеша изображения заключается в том, что вы можете хранить хеш-значения ваших изображений в файле, вам не нужно снова и снова вычислять значения хэша.

Simple and fast method to compare images for similarity покажет вам более подробную информацию о модуле img_hash opencv.

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