C#矩阵卷积计算(测绘程序设计)

        遥感图像处理的过程中,经常要进行图像增强、图像滤波、边缘提取等操作,将原始影像与算子模板进行卷积计算。

首先了解一下卷积计算的过程:

945bb48c771a5d0ac1a8c2c293ec57c3.png

        卷积操作其实就是每次取一个特定大小的矩阵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;
        }

页面及计算结果如下

3e43063f0a9d7243e445653eb90ac14b.png

 具体实现我会发布在资源里。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫秋刀鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值