c++实现
并未处理图像,仅用于展示算法;
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool InArea(int i, int j, int rows, int cols)
{
if (i<0 || i>=rows)
return false;
if (j<0 || j>=cols)
return false;
return true;
}
void D4AL(int i,int j, int rows, int cols, vector<vector<int>> &f)
{
if (InArea(i - 1, j, rows, cols))
f[i][j] = min(f[i][j], 1 + f[i - 1][j]);
if (InArea(i - 1, j - 1, rows, cols))
f[i][j] = min(f[i][j], 2 + f[i - 1][j - 1]);
if (InArea(i, j - 1, rows, cols))
f[i][j] = min(f[i][j], 1 + f[i][j - 1]);
if (InArea(i + 1, j - 1, rows, cols))
f[i][j] = min(f[i][j], 2 + f[i + 1][j - 1]);
}
void D4BR(int i, int j, int rows, int cols, vector<vector<int>> &f)
{
if (InArea(i + 1, j, rows, cols))
f[i][j] = min(f[i][j], 1 + f[i + 1][j]);
if (InArea(i + 1, j + 1, rows, cols))
f[i][j] = min(f[i][j], 2 + f[i + 1][j + 1]);
if (InArea(i, j + 1, rows, cols))
f[i][j] = min(f[i][j], 1 + f[i][j + 1]);
if (InArea(i - 1, j + 1, rows, cols))
f[i][j] = min(f[i][j], 2 + f[i - 1][j + 1]);
}
void DistanceTransformD4(vector<vector<int>> &src, vector<vector<int>> &f)
{
int cols = src[0].size();
int rows = src.size();
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
if (src[i][j] == 1)
f[i][j] = 0;
else
f[i][j] = INT_MAX - 2;
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
D4AL(i, j, rows, cols, f);
for (int i = rows - 1; i >= 0; --i)
for (int j = cols - 1; j >= 0; --j)
D4BR(i, j, rows, cols, f);
}
int main()
{
vector<vector<int>> src = {
{0,1,1,0,0,0,1,0 },
{0,1,0,0,0,0,0,1 },
{0,1,0,0,0,0,0,0 },
{0,1,0,0,0,0,0,0 }
};
int rows = src.size();
int cols = src[0].size();
vector<vector<int>> f(rows, vector<int>(cols, 0));
cout << "SRC:" << endl;
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
cout << src[i][j] << " ";
cout << endl;
}
DistanceTransformD4(src, f);
cout << "\nResult:" << endl;
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
cout << f[i][j] << " ";
cout << endl;
}
return 0;
}