Я буду использовать просеивание для определения определенного типа объекта. Что, если этот объект изменит цвет, сможет ли он его распознать? я буду использовать библиотеку opencv для просеивания cv2.xfeatures2d.SIFT_create()
Инвариантен ли алгоритм просеивания в цвете?
Ответы (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
Проверьте мои изображения ниже. Это может быть не так мелкозернисто, как вы хотите, но это начало. Большинство приложений для обработки изображений, как правило, используют оттенки серого, потому что для обработки требуется гораздо меньше данных, чем для полноцветного изображения.
Для справки проверьте эти учебники:
- почему мы должны использовать оттенки серого для обработки изображений
- 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
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);
/* ... */
}