基于C# .NET 的数字图像处理系统开发

嗨,我是射手座的程序媛,期待和大家更多的交流与学习,欢迎添加3512724768。

**

《面向对象程序设计》实习-基于C# .NET 的数字图像处理系统开发

**

(一)实习的目的

根据《面向对象程序设计》理论课授课内容,是使学生掌握课程中讲述的有关面向对象程序设计的理论,同时熟悉C#编程进行Windows应用程序的开发。掌握C# 图形处理软件编程,根据要求完成一个应用程序的设计和开发。加强理论联系实际,提高学生综合面向对象的编程能力。
(二)实习的任务
使用C#作为开发语言,根据要求完成一个应用程序的开发。实现图像的加载保存以及图像处理的基本功能,如尺度变换(放大缩小)、图像取反、灰度化图像、图像加亮、图像平滑卷积、高斯模糊、图像边缘锐化等功能。

上传图片
在这里插入图片描述
图像取反
在这里插入图片描述
图像灰度化
在这里插入图片描述
图像加亮
在这里插入图片描述
图像边缘提取
在这里插入图片描述
图像平滑卷积

private void converToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (originalImage != null)
            {
                // 创建一个新的 Bitmap 用于存储平滑后的图像
                Bitmap smoothedImage = new Bitmap(originalImage.Width, originalImage.Height);

                // 定义平滑的卷积核(均值滤波器)
                int[,] kernel = {
            { 1, 1, 1 },
            { 1, 1, 1 },
            { 1, 1, 1 }
        };

                int kernelSize = 3;
                int radius = kernelSize / 2;
                int kernelSum = 9; // 3x3 kernel的总和

                // 复制原始图像数据到临时数组,以便在上面进行操作
                Color[,] pixels = new Color[originalImage.Width, originalImage.Height];
                for (int x = 0; x < originalImage.Width; x++)
                {
                    for (int y = 0; y < originalImage.Height; y++)
                    {
                        pixels[x, y] = originalImage.GetPixel(x, y);
                    }
                }

                // 应用卷积核进行平滑
                for (int x = radius; x < originalImage.Width - radius; x++)
                {
                    for (int y = radius; y < originalImage.Height - radius; y++)
                    {
                        int r = 0, g = 0, b = 0;

                        // 计算卷积
                        for (int i = -radius; i <= radius; i++)
                        {
                            for (int j = -radius; j <= radius; j++)
                            {
                                int px = x + i;
                                int py = y + j;
                                Color pixel = pixels[px, py];
                                int kernelValue = kernel[i + radius, j + radius];

                                r += pixel.R * kernelValue;
                                g += pixel.G * kernelValue;
                                b += pixel.B * kernelValue;
                            }
                        }

                        // 确保颜色值在有效范围内
                        r = Math.Max(0, Math.Min(255, r / kernelSum));
                        g = Math.Max(0, Math.Min(255, g / kernelSum));
                        b = Math.Max(0, Math.Min(255, b / kernelSum));

                        // 设置新像素值
                        smoothedImage.SetPixel(x, y, Color.FromArgb(r, g, b));
                    }
                }

                // 显示平滑后的图像
                pictureBox1.Image = smoothedImage;
            }
        }

高斯模糊

 private void gaussianBlurToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (originalImage != null)
            {
                // 应用高斯模糊
                Bitmap blurredImage = ApplyGaussianBlur(originalImage, 5); // 使用半径为 5 的高斯模糊

                // 显示处理后的图像
                pictureBox1.Image = blurredImage;
            }
        }

        private Bitmap ApplyGaussianBlur(Bitmap image, int radius)
        {
            Bitmap blurredImage = new Bitmap(image.Width, image.Height);

            // 根据半径计算高斯核
            double[,] kernel = CalculateGaussianKernel(radius);

            // 卷积操作
            for (int x = radius; x < image.Width - radius; x++)
            {
                for (int y = radius; y < image.Height - radius; y++)
                {
                    double r = 0, g = 0, b = 0;
                    for (int i = -radius; i <= radius; i++)
                    {
                        for (int j = -radius; j <= radius; j++)
                        {
                            Color pixel = image.GetPixel(x + i, y + j);
                            double weight = kernel[i + radius, j + radius];

                            r += pixel.R * weight;
                            g += pixel.G * weight;
                            b += pixel.B * weight;
                        }
                    }

                    // 将新像素值存入模糊图像
                    blurredImage.SetPixel(x, y, Color.FromArgb((int)r, (int)g, (int)b));
                }
            }

            return blurredImage;
        }

        private double[,] CalculateGaussianKernel(int radius)
        {
            int size = radius * 2 + 1;
            double[,] kernel = new double[size, size];
            double sigma = radius / 3.0; // 根据经验设定 sigma

            double twoSigmaSquare = 2 * sigma * sigma;
            double constant = 1.0 / (Math.PI * twoSigmaSquare);

            double sum = 0;

            for (int i = -radius; i <= radius; i++)
            {
                for (int j = -radius; j <= radius; j++)
                {
                    double distance = i * i + j * j;
                    kernel[i + radius, j + radius] = constant * Math.Exp(-distance / twoSigmaSquare);
                    sum += kernel[i + radius, j + radius];
                }
            }

            // 标准化
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    kernel[i, j] /= sum;
                }
            }

            return kernel;
        }

仅展示部分代码,详细代码如下
在这里插入图片描述
嗨,我是射手座的程序媛,期待和大家更多的交流与学习,欢迎添加3512724768。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值