Инвариантен ли алгоритм просеивания в цвете?

Я буду использовать просеивание для определения определенного типа объекта. Что, если этот объект изменит цвет, сможет ли он его распознать? я буду использовать библиотеку opencv для просеивания cv2.xfeatures2d.SIFT_create()


person jude    schedule 19.11.2016    source источник


Ответы (2)


что ты уже испробовал? Вы можете проверить это с помощью эксперимента, такого как ..

import cv2
img = cv2.imread('0.jpg',1) # 1 = read image as color
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(img,None)
img2 = cv2.drawKeypoints(img,kp,None)
cv2.imwrite('siftkpcolor.jpg',img2)

Затем вы можете снова запустить код с тем же изображением и сделать

import cv2
img = cv2.imread('0.jpg',0) # 0 = read image as gray
sift= cv2.xfeatures2d.SIFT_create()
kp = sift.detect(img,None)
img2 = cv2.drawKeypoints(img,kp,None)
cv2.imwrite("siftkpgray.jpg",img2)

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

>>>cv2.__version__
3.1.0-dev

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

Для справки проверьте эти учебники:

  1. почему мы должны использовать оттенки серого для обработки изображений
  2. http://docs.opencv.org/3.1.0/da/df5/tutorial_py_sift_intro.html
  3. http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_image_display/py_image_display.html

Цветной КП

Серый КП

person Noah Christopher    schedule 19.11.2016
comment
Я думаю, что теперь достаточно просто проверить. Я попытался сравнить дескрипторы, если des == des2: des для цвета и des2 для дескрипторов оттенков серого. он говорит, что это не то же самое. хотя я не знаю, верен ли результат, так как я сравниваю многомерный массив с другим многомерным массивом, что вы думаете? - person jude; 20.11.2016
comment
Я также использовал opencv 3.1.0 в python. - person jude; 20.11.2016
comment
Я не уверен, что дескрипторы детерминированы при каждом выполнении алгоритма. Что вы можете сделать, так это взять меньшее/обрезанное изображение, которое имеет только несколько функций, и вручную проверить результаты des (цвет) и des (серый), чтобы увидеть, что у вас получится. - person Noah Christopher; 20.11.2016
comment
Имеет ли цвет кругов от ключевых точек на вашей картине какое-либо значение или это просто для того, чтобы отличить одно от другого. кажется, что у него такие же ключевые точки, но другой цвет - person jude; 20.11.2016
comment
Насколько я знаю, цвет не имеет значения. Вы также можете попробовать img=cv2.drawKeypoints(gray,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS), и я полагаю, что размер кругов будет варьироваться в зависимости от ориентации и величины ключевой точки при использовании этого флага. - person Noah Christopher; 20.11.2016

SIFT работает только с изображениями в градациях серого. В заключении статьи Лоу отмечает:

Признаки, описанные в этой статье, используют только монохромное яркостное изображение, поэтому дополнительную различимость можно получить, включив инвариантные к освещению цветовые дескрипторы (Funt and Finlayson, 1995; Brown and Lowe, 2002).

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

static Mat createInitialImage( const Mat& img, bool doubleImageSize, float sigma )
{
    /* ... */
    Mat gray, gray_fpt;
    if( img.channels() == 3 || img.channels() == 4 )
    {
        cvtColor(img, gray, COLOR_BGR2GRAY);
        gray.convertTo(gray_fpt, DataType<sift_wt>::type, SIFT_FIXPT_SCALE, 0);
    }
    else
        img.convertTo(gray_fpt, DataType<sift_wt>::type, SIFT_FIXPT_SCALE, 0);
    /* ... */
}
person cyang    schedule 22.12.2016