2013-02-23 75 views
0

例如,我有两个图像,其中第一个是规则的,第二个是颜色反转(我的意思是255像素的颜色值)。如何使用SIFT算法与彩色反转图像

我已经使用OpenCV和Lowe paper将SIFT算法应用到他们两个,所以现在我有每个图像的关键点和描述符。

KeyPoints位置确实匹配,但由于颜色反转,KeyPoints方向和描述符值不匹配。

我很好奇有人试图解决这样的问题吗?


此外 这里的梯度示例:

我使用的OpenCV下使用this教程和模块/非游离/ SRC/sift.cpp文件++实现。此外,我做了下面的方法来看待梯度:梯度的

void MINE::showKeypoints(cv::Mat image, std::vector<cv::KeyPoint> keypoints, string number) 
{ 
    cv::Mat img; 
    image.copyTo(img); 

    for(int i=0;i<(int)keypoints.size();i++) 
    { 
     cv::KeyPoint kp = keypoints[i]; 

     cv::line(img, cv::Point2f(kp.pt.x ,kp.pt.y), cv::Point2f(kp.pt.x ,kp.pt.y), CV_RGB(255,0,0), 4); 
     cv::line(img, cv::Point2f(kp.pt.x ,kp.pt.y), cv::Point2f(kp.pt.x+kp.size*cos(kp.angle),kp.pt.y+kp.size*sin(kp.angle)), CV_RGB(255,255,0), 1); 
    } 
    cv::imshow (str, img); 
} 

Example 例。

正如你可以看到倒置和原始图像的梯度不是相反

+0

难道你只是反转第二种颜色? :D – karlphillip 2013-02-23 15:40:36

+0

不,重点是使SIFt不变色反转,我知道可以将8 bin直方图更改为4 bin,将前4个bin添加到第4个bin并将last 4改为零,但它应该是别的东西。 – fen1ksss 2013-02-23 16:45:34

回答

4

如果negate输入图像然后梯度将具有相反方向G <- -G)。

您需要提醒的是,SIFT描述基本的梯度定向直方图:

histogram of gradients

由于梯度反转图像上否定我们得到:

  • 0th arrow => 4th arrow
  • 1st arrow => 5th arrow
  • 2nd arrow => 6th arrow
  • 3th arrow => 7th arrow

换句话说,如果您首先考虑的8箱直方图(总共有4×4这样的直方图),如果你表示ab等相关SIFT描述组件,我们有:

  • 原始图像:[a, b, c, d, e, f, g, h]
  • 反转图像:[e, f, g, h, a, b, c, d]

因此,您可以通过交换4个大小的组件来转换反转图像SIFT描述符。

伪算法:

# `sift` is the 128-sized array that represents the descriptor 
NCELLS = 16 
NORI = 8 

0.upto(NCELLS - 1) do |cell| 
    offset = cell * NORI 
    offset.upto(offset + NORI/2 - 1) do |i| 
    sift.swap!(i, i + NORI/2) 
    end 
end 

以下是如何与vlfeat验证这一点:

  1. 否定默认图像:convert -negate default.pgm negate.pgm
  2. 在默认图像中提取关键点:./sift --frames default.pgm
  3. 选择第一个键INT:./sift --descriptors --read-frames kpt.frame default.pgm
  4. 与否定图像描述它:tail -n 1 default.frame > kpt.frame
  5. 用默认图像描述它./sift --descriptors --read-frames kpt.frame negate.pgm
  6. 格式,每行4个分量都描述符(见下文)

然后可视化输出与例如diff -uopendiff:按预期方式将行按2乘2交换。

cat default.descr | ruby -e\ 
'STDIN.read.split(" ").each_slice(4) {|s| p s}'\ 
> default.out 

cat negate.descr | ruby -e\ 
'STDIN.read.split(" ").each_slice(4) {|s| p s}'\ 
> negate.out 
+0

感谢您的解释,但正如你在这里可以看到http://i.stack.imgur.com/XRfdh.png渐变不是绝对相反 – fen1ksss 2013-02-24 12:52:55

+0

请参阅编辑一步一步检查与[vlfeat](http ://www.vlfeat.org/)SIFT的实施。 – deltheil 2013-02-24 15:04:11

+0

我不明白“编辑”是什么意思。我正在使用OpenCV实现,我理解它是如何工作的,但仍然不明白为什么梯度应该有相反的方向(如屏幕截图所示) – fen1ksss 2013-02-25 06:39:13

0

deltheil的回答是正确的,但是我们可以很容易地由8个描述符元素,而不改变梯度的方向改变16的顺序(基本上是同样的,但更简单的实现)

例如,我们有2x4的描述,

原来是:

[a,b 
c,d 
e,f 
g,h] 

倒会:

[g,h 
e,f 
c,d 
a,b] 
相关问题