retrieveImages

Поиск по набору изображений для аналогичного изображения

Описание

пример

imageIDs = retrieveImages(queryImage,imageIndex) возвращает индексы, соответствующие изображениям в imageIndex которые визуально аналогичны изображению запроса. The imageIDs выход содержит индексы в ранжированном порядке от наиболее к наименее подобному соответствию.

пример

[imageIDs,scores] = retrieveImages(queryImage,imageIndex) опционально возвращает счета подобия, используемые для ранжирования результатов поиска изображений. The scores выход содержит соответствующие счета от 0 до 1.

пример

[imageIDs,scores,imageWords] = retrieveImages(queryImage,imageIndex) при необходимости возвращает визуальные слова в queryImage которые используются для поиска аналогичных изображений.

пример

[imageIDs,___] = retrieveImages(queryImage,imageIndex,Name,Value) использует дополнительные опции, заданные одним или несколькими Name,Value аргументы в виде пар, с использованием любого из предыдущих синтаксисов.

Примеры

свернуть все

Создайте изображение набор обложек книг.

dataDir = fullfile(toolboxdir('vision'),'visiondata','bookCovers');
bookCovers = imageDatastore(dataDir);

Отобразите набор данных.

thumbnailGallery = [];
for i = 1:length(bookCovers.Files)
    I = readimage(bookCovers,i);
    thumbnail = imresize(I,[300 300]);
    thumbnailGallery = cat(4,thumbnailGallery,thumbnail);
end

figure
montage(thumbnailGallery);

Figure contains an axes. The axes contains an object of type image.

Проиндексируйте набор изображений. Этот шаг может занять несколько минут.

imageIndex = indexImages(bookCovers);
Creating an inverted image index using Bag-Of-Features.
-------------------------------------------------------

Creating Bag-Of-Features.
-------------------------

* Selecting feature point locations using the Detector method.
* Extracting SURF features from the selected feature point locations.
** detectSURFFeatures is used to detect key points for feature extraction.

* Extracting features from 58 images...done. Extracted 29216 features.

* Keeping 80 percent of the strongest features from each category.

* Balancing the number of features across all image categories to improve clustering.
** Image category 1 has the least number of strongest features: 23373.
** Using the strongest 23373 features from each of the other image categories.

* Using K-Means clustering to create a 20000 word visual vocabulary.
* Number of features          : 23373
* Number of clusters (K)      : 20000

* Initializing cluster centers...100.00%.
* Clustering...completed 7/100 iterations (~0.45 seconds/iteration)...converged in 7 iterations.

* Finished creating Bag-Of-Features


Encoding images using Bag-Of-Features.
--------------------------------------

* Encoding 58 images...done.
Finished creating the image index.

Выберите и отобразите изображение запроса.

queryDir = fullfile(dataDir,'queries',filesep);
queryImage = imread([queryDir 'query3.jpg']);

imageIDs = retrieveImages(queryImage,imageIndex);

Отобразите изображение запроса и его лучшее соответствие, один за другим.

bestMatch = imageIDs(1);
bestImage = imread(imageIndex.ImageLocation{bestMatch});

figure
imshowpair(queryImage,bestImage,'montage')

Figure contains an axes. The axes contains an object of type image.

Поиск по набору изображений для объекта с помощью видимой области (ROI) для изображения запроса.

Задайте набор изображений для поиска.

imageFiles = ...
  {'elephant.jpg', 'cameraman.tif', ...
  'peppers.png',  'saturn.png',...
  'pears.png',    'stapleRemover.jpg', ...
  'football.jpg', 'mandi.tif',...
  'kids.tif',     'liftingbody.png', ...
  'office_5.jpg', 'gantrycrane.png',...
  'moon.tif',     'circuit.tif', ...
  'tape.png',     'coins.png'};

imds = imageDatastore(imageFiles);

Создайте поисковый индекс.

 imageIndex = indexImages(imds);
Creating an inverted image index using Bag-Of-Features.
-------------------------------------------------------

Creating Bag-Of-Features.
-------------------------

* Selecting feature point locations using the Detector method.
* Extracting SURF features from the selected feature point locations.
** detectSURFFeatures is used to detect key points for feature extraction.

* Extracting features from 16 images...done. Extracted 3680 features.

* Keeping 80 percent of the strongest features from each category.

* Balancing the number of features across all image categories to improve clustering.
** Image category 1 has the least number of strongest features: 2944.
** Using the strongest 2944 features from each of the other image categories.

* Using K-Means clustering to create a 20000 word visual vocabulary.
* Number of features          : 2944
* Number of clusters (K)      : 2944

* Initializing cluster centers...100.00%.
* Clustering...completed 1/100 iterations (~0.05 seconds/iteration)...converged in 1 iterations.

* Finished creating Bag-Of-Features


Encoding images using Bag-Of-Features.
--------------------------------------

* Encoding 16 images...done.
Finished creating the image index.

Задайте изображение запроса и информация только для чтения. Информация только для чтения очерчивает объект, слон, для поиска.

queryImage = imread('clutteredDesk.jpg');
queryROI = [130 175 330 365];

figure
imshow(queryImage)
rectangle('Position',queryROI,'EdgeColor','yellow')

Figure contains an axes. The axes contains 2 objects of type image, rectangle.

Можно также использовать imrect функция для интерактивного выбора информация только для чтения. Для примера, queryROI = getPosition(imrect)

Найдите изображения, которые содержат объект.

imageIDs = retrieveImages(queryImage,imageIndex,'ROI',queryROI)
imageIDs = 12×1

     1
    11
     6
    12
     2
     3
     8
    10
    13
    14
      ⋮

Отобразите лучшее соответствие.

bestMatch = imageIDs(1);

figure
imshow(imageIndex.ImageLocation{bestMatch})

Figure contains an axes. The axes contains an object of type image.

Используйте местоположения визуальных слов, чтобы проверить лучший результат поиска. Чтобы ранжировать результаты поиска на основе геометрической информации, повторите эту процедуру для верхних результатов поиска N.

Укажите местоположение изображений.

dataDir = fullfile(toolboxdir('vision'),'visiondata','bookCovers');
bookCovers = imageDatastore(dataDir);

Проиндексируйте набор изображений. Этот процесс может занять несколько минут.

imageIndex = indexImages(bookCovers);
Creating an inverted image index using Bag-Of-Features.
-------------------------------------------------------

Creating Bag-Of-Features.
-------------------------

* Selecting feature point locations using the Detector method.
* Extracting SURF features from the selected feature point locations.
** detectSURFFeatures is used to detect key points for feature extraction.

* Extracting features from 58 images...done. Extracted 29216 features.

* Keeping 80 percent of the strongest features from each category.

* Balancing the number of features across all image categories to improve clustering.
** Image category 1 has the least number of strongest features: 23373.
** Using the strongest 23373 features from each of the other image categories.

* Using K-Means clustering to create a 20000 word visual vocabulary.
* Number of features          : 23373
* Number of clusters (K)      : 20000

* Initializing cluster centers...100.00%.
* Clustering...completed 7/100 iterations (~0.61 seconds/iteration)...converged in 7 iterations.

* Finished creating Bag-Of-Features


Encoding images using Bag-Of-Features.
--------------------------------------

* Encoding 58 images...done.
Finished creating the image index.

Выберите и отобразите изображение запроса.

queryDir = fullfile(dataDir,'queries',filesep);
queryImage = imread([queryDir 'query3.jpg']);

figure
imshow(queryImage)

Figure contains an axes. The axes contains an object of type image.

Извлечение наилучших соответствий. The queryWords выход содержит информацию о расположении визуальных слов для изображения запроса. Используйте эту информацию для проверки результатов поиска.

[imageIDs, ~, queryWords] = retrieveImages(queryImage,imageIndex);

Найдите лучшее соответствие для изображения запроса путем извлечения визуальных слов из индекса изображения. Индекс изображения содержит информацию о визуальном слове для всех изображений в индексе.

bestMatch = imageIDs(1);
bestImage = imread(imageIndex.ImageLocation{bestMatch});
bestMatchWords = imageIndex.ImageWords(bestMatch);

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

queryWordsIndex     = queryWords.WordIndex;
bestMatchWordIndex  = bestMatchWords.WordIndex;

tentativeMatches = [];
for i = 1:numel(queryWords.WordIndex)
    
    idx = find(queryWordsIndex(i) == bestMatchWordIndex);
    
    matches = [repmat(i, numel(idx), 1) idx];
    
    tentativeMatches = [tentativeMatches; matches];
    
end

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

points1 = queryWords.Location(tentativeMatches(:,1),:);
points2 = bestMatchWords.Location(tentativeMatches(:,2),:);

figure
showMatchedFeatures(queryImage,bestImage,points1,points2,'montage')

Figure contains an axes. The axes contains 4 objects of type image, line.

Удалите плохие назначения визуальных слов с помощью estimateGeometricTransform2D функция. Сохраните назначения, которые соответствуют допустимому геометрическому преобразованию.

[tform,inlierIdx] = ...
    estimateGeometricTransform2D(points1,points2,'affine',...
        'MaxNumTrials',2000);
inlierPoints1 = points1(inlierIdx, :);
inlierPoints2 = points2(inlierIdx, :);

Оцените результаты поиска по проценту инлиеров. Сделайте это, когда геометрическая процедура верификации применяется к верхним результатам поиска N. Изображения с более высоким процентом инлиеров с большей вероятностью будут релевантными.

percentageOfInliers = size(inlierPoints1,1)./size(points1,1);

figure
showMatchedFeatures(queryImage,bestImage,inlierPoints1,...
    inlierPoints2,'montage')

Figure contains an axes. The axes contains 4 objects of type image, line.

Примените расчетное преобразование.

outputView = imref2d(size(bestImage));
Ir = imwarp(queryImage, tform, 'OutputView', outputView);

figure
imshowpair(Ir,bestImage,'montage')

Figure contains an axes. The axes contains an object of type image.

Используйте evaluateImageRetrieval функция, которая помогает выбрать правильные параметры поиска.

Создайте набор изображений.

setDir  = fullfile(toolboxdir('vision'),'visiondata','imageSets','cups');
imds = imageDatastore(setDir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');

Проиндексируйте набор изображений.

 imageIndex = indexImages(imds,'Verbose',false);

Настройка параметров поиска изображений.

imageIndex.MatchThreshold = 0.2;
imageIndex.WordFrequencyRange = [0 1]
imageIndex = 
  invertedImageIndex with properties:

         ImageLocation: {6x1 cell}
            ImageWords: [6x1 vision.internal.visualWords]
         WordFrequency: [1x1366 double]
         BagOfFeatures: [1x1 bagOfFeatures]
        MatchThreshold: 0.2000
    WordFrequencyRange: [0 1]

queryImage = readimage(imds, 1);
indices = retrieveImages(queryImage,imageIndex);

Входные параметры

свернуть все

Изображение вопроса входа, определенное или как M изображением <reservedrangesplaceholder2>-by-3 truecolor или как M N 2-м изображением оттенков серого.

Типы данных: single | double | int16 | uint8 | uint16 | logical

Индекс поиска изображений, заданный как invertedImageIndex объект. indexImages функция создает invertedImageIndex объект, который хранит данные, используемые для поиска изображений.

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'NumResults', 25 устанавливает 'NumResults' свойство к 25

Максимальное количество результатов для возврата, заданное как разделенная разделенными запятой парами, состоящая из 'NumResults'и числовое значение. Установите это значение равным Inf чтобы вернуть как можно больше совпадающих изображений.

Область поиска изображений запроса, заданная как разделенная разделенными запятой парами, состоящая из 'ROI[<reservedrangesplaceholder3> <reservedrangesplaceholder2> <reservedrangesplaceholder1> <reservedrangesplaceholder0>] вектор.

Выходные аргументы

свернуть все

Ранжированный индекс извлеченных изображений, возвращенный как вектор M -by-1. Идентификаторы изображений возвращаются в ранжированном порядке от наиболее к наименее подобному совпадающему изображению.

Метрика подобия, возвращенная как вектор N -by-1. Этот выход содержит счета, которые соответствуют извлеченным изображениям в imageIDs выход. Счета вычисляются с помощью подобия косинуса и варьируются от 0 до 1.

Объект для хранения визуальных назначений слов, возвращенный как visualWords объект. Объект хранит визуальные назначения слов queryImage и их местоположения на этом изображении.

Ссылки

[1] Сивич, Дж. И. Зиссерман. Видео Google: Подход поиска текста к соответствию объектов в видео. ICCV (2003) стр. 1470-1477.

[2] Philbin, J., O. Chum, M. Isard, J. Sivic, and A. Zisserman. Поиск объектов с большими словарями и быстрым пространственным совпадением. CVPR (2007).

Введенный в R2015a