• 【C#】对两张图片进行矩阵运算会怎么样?


    对两张图片进行矩阵运算会怎么样?

    在学习《线性代数》的矩阵运算时,突然想到图片也可以算是一种矩阵,那么对图片进行矩阵的运算会出现什么样的效果呢?为了满足好奇,便用C#写了个对图片进行矩阵运算的程序。

    矩阵加:

    Bitmap C = new Bitmap(imgA.Width,imgA.Height);
    
                for (int i=0;i<imgA.Width; i++)
                {
                    for(int j=0;j<imgA.Height;j++)
                    {
                        Color A = imgA.GetPixel(i, j), B = imgB.GetPixel(i, j);
                        int r = A.R + B.R;
                        int g = A.G + B.G;
                        int b = A.B + B.B;
                        Color colC = Color.FromArgb(r%256,g%256,b%256);
                        C.SetPixel(i, j, colC);
                    }
                }
                pictureBox3.Image = C;
    

    这是两个图片经过矩阵加法运算后的结果,由于直接加会使RGB大于255,因此在运算后,我们对256进行取模运算,避免越界。

    矩阵减:

    Bitmap C = new Bitmap(imgA.Width, imgA.Height);
                for (int i = 0; i < imgA.Width; i++)
                {
                    for (int j = 0; j < imgA.Height; j++)
                    {
                        Color A = imgA.GetPixel(i, j), B = imgB.GetPixel(i, j);
                        int r = A.R - B.R;
                        int g = A.G - B.G;
                        int b = A.B - B.B;
                        Color colC = Color.FromArgb(Math.Abs(r) % 256, Math.Abs(g) % 256, Math.Abs(b) % 256);
                        C.SetPixel(i, j, colC);
                    }
                }
                pictureBox3.Image = C;
    

    由于减法运算时,可能使图片RGB小于0,因此我们对运算后的结果进行Abs()运算,取其绝对值。

    矩阵乘

    MessageBox.Show((imgA.Width * imgB.Height * Math.Min(imgA.Height, imgB.Width)).ToString());
                Bitmap C = new Bitmap(imgA.Width, imgB.Height);
                for (int i = 0; i < imgA.Width; i++)
                {
                    for (int j = 0; j < imgB.Height; j++)
                    {
                        int r=0, g=0, b=0;
                        for(int k =0;k<Math.Min(imgA.Height,imgB.Width);k++)
                        {
                            Color A = imgA.GetPixel(i, k), B = imgB.GetPixel(k, j);
                             r += A.R * B.R;
                             g += A.G * B.G;
                             b += A.B * B.B;
    
                        }
                        Color colC = Color.FromArgb(r % 256, g % 256, b % 256);
                        //Console.WriteLine(i.ToString()+","+j.ToString()+":"+colC.ToString());
                        C.SetPixel(i, j, colC);
                    }
                    
                }
                pictureBox3.Image = C;
    

    由于复杂度为O(N^3),正常图片没跑出来,因此用PS新建了两张50*50的小图片,成功跑出来了,结果发现全是噪点,比随机还随机。。。

  • 相关阅读:
    隐式马尔科夫模型
    TCP与UDP协议
    语法分析
    requests发送HTTP请求
    IPv6协议
    IP协议
    路由协议
    Django表单验证
    PDB调试Python程序
    word2vec模型原理与实现
  • 原文地址:https://www.cnblogs.com/virtualman/p/14385526.html
Copyright © 2020-2023  润新知