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 的数据要少得多。
查看这些教程作为参考:
- why we should use gray scale for image processing
- http://docs.opencv.org/3.1.0/da/df5/tutorial_py_sift_intro.html
- 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);
/* ... */
}
我将使用 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 的数据要少得多。
查看这些教程作为参考:
- why we should use gray scale for image processing
- http://docs.opencv.org/3.1.0/da/df5/tutorial_py_sift_intro.html
- 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);
/* ... */
}