gpt4 book ai didi

c++ - 实现结构化张量

转载 作者:行者123 更新时间:2023-11-30 05:04:21 27 4
gpt4 key购买 nike

我正在尝试实现一篇名为Structured Tensor Based Image Interpolation 的论文。在论文中,它所做的是使用结构张量根据结构张量的特征值将图像中的每个像素分为三个不同的类别(均匀、角落和边缘)。

为了实现这一点,我编写了以下代码:

void tensorComputation(Mat dx, Mat dy, Mat magnitude)
{

Mat dx2, dy2, dxy;
GaussianBlur(magnitude, magnitude, Size(3, 3), 0, 0, BORDER_DEFAULT);
// Calculate image derivatives
multiply(dx, dx, dx2);
multiply(dy, dy, dy2);
multiply(dx, dy, dxy);

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;
}

这里dx, dy, magnitude分别是图像的x轴导数、y轴导数和幅值。

我所知道的是我已经找到了整个图像的结构化张量。但我的问题是我需要为图像中的每个像素计算结构化张量。如何实现?

最佳答案

在您的代码中,您模糊了 magnitude,但随后不使用它。你根本不需要这个量级。

您正确构建了结构张量,但对整个图像进行了平均。您要做的是应用本地 平均。对于每个像素,结构张量是邻域像素矩阵的平均值。您可以通过对张量的每个分量应用高斯模糊来计算它:dx2dy2dxy

Gaussian 的 sigma 越大,平均的邻域就越大。您会获得更多的正则化(对噪声不太敏感)但分辨率也会降低(对小变化和短边不太敏感)。尝试使用参数,直到获得所需的内容。 2 到 5 之间的 Sigma 很常见。

接下来,您需要计算每个像素的特征分解。我不知道 OpenCV 是否使这变得容易。我建议您改用 DIPlib 3。它具有计算和使用结构张量的正确基础设施。 See here how easy it can be.

关于c++ - 实现结构化张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48950505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com