如何使用OpenCV计算图像的结构张量

622

我正在尝试实现一个使用图像在大型图像数据库中搜索相似图像的应用程序。我正在开发用于此搜索的图像描述符,我想将颜色信息与某些渐变信息结合起来。我已经看到了在该域中使用的结构张量来查找图像或子图像中的主梯度方向。

我想拍摄一张图像,将其划分为子图像网格,例如4x4网格(总共16个子图像),然后找到每个像元的前导梯度方向。为了找到领先的梯度方向,我想看看是否为每个像元计算结构张量可以很好地表示图像梯度并改善图像匹配度。这是一个好主意还是一个坏主意?想法是获得与本文第3.2节类似的特征向量http://cybertron.cg.tu-berlin.de/eitz/pdf/2009_sbim.pdf

将图像划分为子图像(单元)是微不足道的,并且使用opencv,我可以使用Sobel函数计算偏导数。

Mat dx, dy; 
Sobel(im, dx, CV_32F, 1, 0, 3, 1, 0, BORDER_DEFAULT);
Sobel(im, dy, CV_32F, 0, 1, 3, 1, 0, BORDER_DEFAULT); 

计算dx ^ 2,dy ^ 2和dxy应该不是问题,但是我不确定如何计算结构张量矩阵并使用张量矩阵来找到图像或子图像的主梯度方向。如何使用OpenCV来实现呢?

编辑好的,这就是我所做的。

    Mat _im; // Image to compute main gradient direction for. 
    cvtColor(im, _im, CV_BGR2GRAY);
    GaussianBlur(_im, _im, Size(3, 3), 0, 0, BORDER_DEFAULT); //Blur the image to remove unnecessary details. 
    GaussianBlur(_im, _im, Size(5, 5), 0, 0, BORDER_DEFAULT);
    GaussianBlur(_im, _im, Size(7, 7), 0, 0, BORDER_DEFAULT);

    // Calculate image derivatives 
    Mat dx2, dy2, dxy; 
    Sobel(_im, dx2, CV_32F, 2, 0, 3, 1, 0, BORDER_DEFAULT); 
    Sobel(_im, dy2, CV_32F, 0, 2, 3, 1, 0, BORDER_DEFAULT);
    Sobel(_im, dxy, CV_32F, 1, 1, 3, 1, 0, BORDER_DEFAULT);

    Mat t(2, 2, CV_32F); // tensor matrix

    // Insert values to the tensor matrix.
    t.at<float>(0, 0) = sum(dx2)[0];
    t.at<float>(0, 1) = sum(dxy)[0];
    t.at<float>(1, 0) = sum(dxy)[0];
    t.at<float>(1, 1) = sum(dy2)[0];

    // eigen decomposition to get the main gradient direction. 
    Mat eigVal, eigVec;
    eigen(t, eigVal, eigVec);

    // This should compute the angle of the gradient direction based on the first eigenvector. 
    float* eVec1 = eigVec.ptr<float>(0);
    float* eVec2 = eigVec.ptr<float>(1);
    cout << fastAtan2(eVec1[0], eVec1[1]) << endl;
    cout << fastAtan2(eVec2[0], eVec2[1]) << endl;

这种方法正确吗?


应用程序使用此图像输出44.9905,135.01。得出0、90。


当我使用真实图像的一部分时,我得到342.743、72.7425,这很奇怪。我期望沿着颜色变化获得一个角度(90欧元)。

经过测试后,我不确定我的实现是否正确,因此欢迎对此提出任何反馈或意见。

胡萝卜派

我相信您的问题是您正在计算二阶导数而不是对一阶导数求平方。应该是这样的:

// Calculate image derivatives 
Mat dx, dy; 
Mat dx2, dy2, dxy;
Sobel(_im, dx, CV_32F, 1, 0); 
Sobel(_im, dy, CV_32F, 0, 1);
multiply(dx, dx, dx2);
multiply(dy, dy, dy2);
multiply(dx, dy, dxy);

PS哦,顺便说一句,无需一遍又一遍地进行高斯模糊。只需使用更大的内核并模糊一次即可。DS

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用OpenCV计算图像的结构张量

来自分类Dev

计算张量后,如何将其显示为图像?

来自分类Dev

如何使用OpenCV图像遮罩

来自分类Dev

如何使用Opencv Python计算一个图像中有多少个白色“球”?

来自分类Dev

如何使用张量流实时对图像进行分类?

来自分类Dev

如何使用张量流实时对图像进行分类?

来自分类Dev

如何随机旋转张量图像

来自分类Dev

使用OpenCV的Sobel操作计算图像梯度方向

来自分类Dev

使用OpenCV和Python计算图像上的特殊元素

来自分类Dev

使用OpenCV的Sobel操作计算图像梯度方向

来自分类Dev

如何使用OpenCV显示PGM图像

来自分类Dev

如何使用OpenCV对齐多个相机图像

来自分类Dev

如何使用OpenCV删除图像中的文本

来自分类Dev

如何使用opencv在图像上添加边缘?

来自分类Dev

如何使用OpenCV Python显示图像的轮廓?

来自分类Dev

OpenCV的 - 如何使用floodFill与RGB图像?

来自分类Dev

如何使用OpenCV删除图像的背景?

来自分类Dev

如何使用OpenCV比较2组图像

来自分类Dev

如何使用opencv在图像上产生眩光

来自分类Dev

如何使用opencv python从底部裁剪图像

来自分类Dev

如何在OPenCV中计算32位浮点图像的图像直方图

来自分类Dev

在OpenCv中计算cv :: Mat的外部(张量)乘积

来自分类Dev

如何从URL提供张量流图像?

来自分类Dev

如何直接从 url 将图像读入张量

来自分类Dev

OpenCV Xamarin FindContours-如何使用层次结构

来自分类Dev

OpenCV Xamarin FindContours-如何使用层次结构

来自分类Dev

使用张量板时,如何总结在多个小批处理中计算出的损失?

来自分类Dev

OpenCV Mat 图像数据结构

来自分类Dev

如何使用张量流中的QueueRunner将动态创建的输入图像添加到RandomShuffleQueue

Related 相关文章

  1. 1

    如何使用OpenCV计算图像的结构张量

  2. 2

    计算张量后,如何将其显示为图像?

  3. 3

    如何使用OpenCV图像遮罩

  4. 4

    如何使用Opencv Python计算一个图像中有多少个白色“球”?

  5. 5

    如何使用张量流实时对图像进行分类?

  6. 6

    如何使用张量流实时对图像进行分类?

  7. 7

    如何随机旋转张量图像

  8. 8

    使用OpenCV的Sobel操作计算图像梯度方向

  9. 9

    使用OpenCV和Python计算图像上的特殊元素

  10. 10

    使用OpenCV的Sobel操作计算图像梯度方向

  11. 11

    如何使用OpenCV显示PGM图像

  12. 12

    如何使用OpenCV对齐多个相机图像

  13. 13

    如何使用OpenCV删除图像中的文本

  14. 14

    如何使用opencv在图像上添加边缘?

  15. 15

    如何使用OpenCV Python显示图像的轮廓?

  16. 16

    OpenCV的 - 如何使用floodFill与RGB图像?

  17. 17

    如何使用OpenCV删除图像的背景?

  18. 18

    如何使用OpenCV比较2组图像

  19. 19

    如何使用opencv在图像上产生眩光

  20. 20

    如何使用opencv python从底部裁剪图像

  21. 21

    如何在OPenCV中计算32位浮点图像的图像直方图

  22. 22

    在OpenCv中计算cv :: Mat的外部(张量)乘积

  23. 23

    如何从URL提供张量流图像?

  24. 24

    如何直接从 url 将图像读入张量

  25. 25

    OpenCV Xamarin FindContours-如何使用层次结构

  26. 26

    OpenCV Xamarin FindContours-如何使用层次结构

  27. 27

    使用张量板时,如何总结在多个小批处理中计算出的损失?

  28. 28

    OpenCV Mat 图像数据结构

  29. 29

    如何使用张量流中的QueueRunner将动态创建的输入图像添加到RandomShuffleQueue

热门标签

归档