遥感图像处理的过程中,经常要进行图像增强、图像滤波、边缘提取等操作,将原始影像与算子模板进行卷积计算。
首先了解一下卷积计算的过程:
卷积操作其实就是每次取一个特定大小的矩阵F(蓝色矩阵中的阴影部分),然后将其对输入X(图中蓝色矩阵)依次扫描并进行内积的运算过程。
程序实现过程中,我们先读取矩阵卷积核,随后读取被卷积操作矩阵来进行编程。
读取两个矩阵:
private void 读取M矩阵ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog op = new OpenFileDialog();
op.Filter = "文本文件(*.txt)|*.txt";
if (op.ShowDialog() == DialogResult.OK)
{
string filepath = op.FileName;
M = FileHelper.ReadM(filepath);
ShowM();
}
}
private void 读取N矩阵ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog op = new OpenFileDialog();
op.Filter = "文本文件(*.txt)|*.txt";
if (op.ShowDialog() == DialogResult.OK)
{
string filepath = op.FileName;
N = FileHelper.ReadN(filepath);
ShowN();
}
}
Algo计算类,其中包括两种算法V1与V2:
class Algo
{
double[,] M;
double[,] N;
public Algo(double[,] M, double[,] N)
{
this.M = M;
this.N = N;
}
//算法1
public double[,] Algo1()
{
int r = N.GetLength(0);
int c = N.GetLength(1);
int r1 = M.GetLength(0);
int c1 = M.GetLength(1);
double[,] V = new double[r, c];
for (int I = 0; I < r; I++)
{
for (int J = 0; J < c; J++)
{
double up = 0, done = 0;
for (int i = 0; i < r1; i++)
{
for (int j = 0; j < c1; j++)
{
double mij = Judge(I, J, i, j);
//判断索引是否会超限,否则为-1运行失败
if (Math.Abs(mij) > 0)
{
up += mij * N[I - i - 1, J - j - 1];
done += mij;
}
}
}
V[I, J] = up / done;
}
}
return V;
}
//算法2
public double[,] Algo2()
{
int r = N.GetLength(0);
int c = N.GetLength(1);
int r1 = M.GetLength(0);
int c1 = M.GetLength(1);
double[,] V2 = new double[r, c];
for (int I = 0; I < r; I++)
{
for (int J = 0; J < c; J++)
{
double up = 0, done = 0;
for (int i = 0; i < r1; i++)
{
for (int j = 0; j < c1; j++)
{
double mij = Judge(I, J, i, j);
//判断索引是否会超限,否则为-1
if (Math.Abs(mij) > 0)
{
up += mij * N[9 - (I - i - 1), 9 - (J - j - 1)];
done += mij;
}
}
}
V2[I, J] = up / done;
}
}
return V2;
}
//判断矩阵计算栅格是否处于边界
private double Judge(int I, int J, int i, int j)
{
double mij = 0;
if (I - i - 1 < 0 || J - j - 1 < 0 || I - i - 1 > 9 || J - j - 1 > 9)
{
mij = 0;
}
else
{
mij = M[i, j];
}
return mij;
}
}
控件显示
private void ShowM()
{
report += "M矩阵\n";
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
report += M[i, j].ToString("0.00") + "\t";
}
report += "\n";
}
richTextBox1.Text = report;
}
private void ShowN()
{
report += "N矩阵\n";
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
report += N[i, j].ToString("0.00") + "\t";
}
report += "\n";
}
richTextBox1.Text = report;
}
private void ShowReport(double[,] V)
{
int r = V.GetLength(0);
int c = V.GetLength(1);
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
report += V[i, j].ToString("0.00") + "\t";
}
report += "\n";
}
richTextBox1.Text = report;
}
页面及计算结果如下
具体实现我会发布在资源里。