sift算法颜色不变吗?

Is sift algorithm invariant in color?

我将使用 sift 来识别某种类型的对象,如果该对象的颜色发生变化,它能识别出来吗?我将使用 opencv 库进行筛选 cv2.xfeatures2d.SIFT_create()

到目前为止你尝试了什么?您可以通过实验验证这一点,例如..

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

检查下面我的图片。这可能没有您想要的那么精细,但这是一个开始。大多数图像处理应用程序倾向于使用灰度,因为与全彩色图像相比,c运行ch 的数据要少得多。

查看这些教程作为参考:

  1. why we should use gray scale for image processing
  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

SIFT 仅对灰度图像进行操作。在 Lowe's paper 的结论中,他指出:

The features described in this paper use only a monochrome intensity image, so further distinctiveness could be derived from including illumination-invariant color descriptors (Funt and Finlayson, 1995; Brown and Lowe, 2002).

OpenCV implementation 在提取特征之前将彩色图像转换为灰度图像。

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);
    /* ... */
}