You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
4.2 KiB
197 lines
4.2 KiB
|
|
|
|
#include "oc_gradient.h"
|
|
|
|
namespace opencorr
|
|
{
|
|
//order of derivative: 1, order of accuracy: 4
|
|
Gradient2D4::Gradient2D4(Image2D& image)
|
|
{
|
|
grad_img = ℑ
|
|
}
|
|
|
|
Gradient2D4::~Gradient2D4() {}
|
|
|
|
void Gradient2D4::getGradientX()
|
|
{
|
|
int height = grad_img->height;
|
|
int width = grad_img->width;
|
|
|
|
gradient_x = Eigen::MatrixXf::Zero(height, width);
|
|
|
|
#pragma omp parallel for
|
|
for (int r = 0; r < height; r++)
|
|
{
|
|
for (int c = 2; c < width - 2; c++)
|
|
{
|
|
float result = 0.0f;
|
|
result -= grad_img->eg_mat(r, c + 2) / 12.f;
|
|
result += grad_img->eg_mat(r, c + 1) * (2.f / 3.f);
|
|
result -= grad_img->eg_mat(r, c - 1) * (2.f / 3.f);
|
|
result += grad_img->eg_mat(r, c - 2) / 12.f;
|
|
gradient_x(r, c) = result;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Gradient2D4::getGradientY()
|
|
{
|
|
int height = grad_img->height;
|
|
int width = grad_img->width;
|
|
|
|
gradient_y = Eigen::MatrixXf::Zero(height, width);
|
|
|
|
#pragma omp parallel for
|
|
for (int r = 2; r < height - 2; r++)
|
|
{
|
|
for (int c = 0; c < width; c++)
|
|
{
|
|
float result = 0.0f;
|
|
result -= grad_img->eg_mat(r + 2, c) / 12.f;
|
|
result += grad_img->eg_mat(r + 1, c) * (2.f / 3.f);
|
|
result -= grad_img->eg_mat(r - 1, c) * (2.f / 3.f);
|
|
result += grad_img->eg_mat(r - 2, c) / 12.f;
|
|
gradient_y(r, c) = result;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Gradient2D4::getGradientXY()
|
|
{
|
|
int height = grad_img->height;
|
|
int width = grad_img->width;
|
|
|
|
gradient_xy = Eigen::MatrixXf::Zero(height, width);
|
|
|
|
if (gradient_x.rows() != height || gradient_x.cols() != width)
|
|
{
|
|
getGradientX();
|
|
}
|
|
|
|
#pragma omp parallel for
|
|
for (int r = 2; r < height - 2; r++)
|
|
{
|
|
for (int c = 0; c < width; c++)
|
|
{
|
|
float result = 0.0f;
|
|
result -= gradient_x(r + 2, c) / 12.f;
|
|
result += gradient_x(r + 1, c) * (2.f / 3.f);
|
|
result -= gradient_x(r - 1, c) * (2.f / 3.f);
|
|
result += gradient_x(r - 2, c) / 12.f;
|
|
gradient_xy(r, c) = result;
|
|
}
|
|
}
|
|
}
|
|
|
|
Gradient3D4::Gradient3D4(Image3D& image)
|
|
{
|
|
grad_img = ℑ
|
|
}
|
|
|
|
Gradient3D4::~Gradient3D4()
|
|
{
|
|
if (gradient_x != nullptr)
|
|
{
|
|
delete3D(gradient_x);
|
|
}
|
|
if (gradient_y != nullptr)
|
|
{
|
|
delete3D(gradient_y);
|
|
}
|
|
if (gradient_z != nullptr)
|
|
{
|
|
delete3D(gradient_z);
|
|
}
|
|
}
|
|
|
|
void Gradient3D4::getGradientX()
|
|
{
|
|
int dim_x = grad_img->dim_x;
|
|
int dim_y = grad_img->dim_y;
|
|
int dim_z = grad_img->dim_z;
|
|
|
|
if (gradient_x != nullptr)
|
|
{
|
|
delete3D(gradient_x);
|
|
}
|
|
gradient_x = new3D(dim_z, dim_y, dim_x);
|
|
|
|
#pragma omp parallel for
|
|
for (int i = 0; i < dim_z; i++)
|
|
{
|
|
for (int j = 0; j < dim_y; j++)
|
|
{
|
|
for (int k = 2; k < dim_x - 2; k++)
|
|
{
|
|
float result = 0.0f;
|
|
result -= grad_img->vol_mat[i][j][k + 2] / 12.f;
|
|
result += grad_img->vol_mat[i][j][k + 1] * (2.f / 3.f);
|
|
result -= grad_img->vol_mat[i][j][k - 1] * (2.f / 3.f);
|
|
result += grad_img->vol_mat[i][j][k - 2] / 12.f;
|
|
gradient_x[i][j][k] = result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Gradient3D4::getGradientY()
|
|
{
|
|
int dim_x = grad_img->dim_x;
|
|
int dim_y = grad_img->dim_y;
|
|
int dim_z = grad_img->dim_z;
|
|
|
|
if (gradient_y != nullptr)
|
|
{
|
|
delete3D(gradient_y);
|
|
}
|
|
gradient_y = new3D(dim_z, dim_y, dim_x);
|
|
|
|
#pragma omp parallel for
|
|
for (int k = 0; k < dim_x; k++)
|
|
{
|
|
for (int i = 0; i < dim_z; i++)
|
|
{
|
|
for (int j = 2; j < dim_y - 2; j++)
|
|
{
|
|
float result = 0.0f;
|
|
result -= grad_img->vol_mat[i][j + 2][k] / 12.f;
|
|
result += grad_img->vol_mat[i][j + 1][k] * (2.f / 3.f);
|
|
result -= grad_img->vol_mat[i][j - 1][k] * (2.f / 3.f);
|
|
result += grad_img->vol_mat[i][j - 2][k] / 12.f;
|
|
gradient_y[i][j][k] = result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Gradient3D4::getGradientZ()
|
|
{
|
|
int dim_x = grad_img->dim_x;
|
|
int dim_y = grad_img->dim_y;
|
|
int dim_z = grad_img->dim_z;
|
|
|
|
if (gradient_z != nullptr)
|
|
{
|
|
delete3D(gradient_z);
|
|
}
|
|
gradient_z = new3D(dim_z, dim_y, dim_x);
|
|
|
|
#pragma omp parallel for
|
|
for (int j = 0; j < dim_y; j++)
|
|
{
|
|
for (int k = 0; k < dim_x; k++)
|
|
{
|
|
for (int i = 2; i < dim_z - 2; i++)
|
|
{
|
|
float result = 0.0f;
|
|
result -= grad_img->vol_mat[i + 2][j][k] / 12.f;
|
|
result += grad_img->vol_mat[i + 1][j][k] * (2.f / 3.f);
|
|
result -= grad_img->vol_mat[i - 1][j][k] * (2.f / 3.f);
|
|
result += grad_img->vol_mat[i - 2][j][k] / 12.f;
|
|
gradient_z[i][j][k] = result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} //namespcae opencorr
|