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

news2024/11/17 7:41:44

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

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

(一)实习的目的

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

上传图片
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1aa2ec5d41754fd8ab35584a18bc39e5

图像取反
在这里插入图片描述

图像灰度化
在这里插入图片描述

图像加亮
在这里插入图片描述
图像锐化
在这里插入图片描述
图像边缘提取

在这里插入图片描述
图像颜色转换
在这里插入图片描述

图像平滑卷积

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1857471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ps基础入门

1.基础 1.1新建文件 1.2创建指定形状 1.4移动工具 1.41移动画布中的任意元素 1.42移动画布 1.43修改画布大小 1.44修改图像大小 1.5框选工具 1.6矩形工具 1.7图层 1.71图层颜色修改 1.72…

【UE5.1 角色练习】12-坐骑——Part2(让角色骑上坐骑)

目录 前言 效果 步骤 一、坐骑的父类 二、将角色附加到坐骑 三、添加坐姿 四、骑上坐骑 五、从坐骑上下来 前言 在上一篇&#xff08;【UE5.1 角色练习】11-坐骑——Part1&#xff08;控制大象移动&#xff09;&#xff09;基础上继续实现角色骑上坐骑的功能。 效果 …

计算机网络期末复习——简明扼要介绍考点及相关知识

期末复习的方法论&#xff1a;一般来说&#xff0c;期末复习都是“理论”结合“实践”。 理论&#xff0c;在于要对期末考点有基本的把握。可以询问老师或者师兄&#xff0c;总之要知道考试的重点在哪里。对照教材&#xff0c;勾画考试重点&#xff0c;删去不重要的琐碎知识点。…

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写 很多想成为一名护理方面的从业者&#xff0c;但是又不知道应该怎么制作一份简历&#xff0c;现在这里分享了一份护理方面的简历模板供大家参考。 蓝山山 年龄&#xff1a;24 号码&#xff1a;12345678910 地址&#xff1a;上海市 邮箱&#xff1a;jianliji…

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式&#xff0c;可以快速查找问题解析&#xff0c;加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语…

2024年【低压电工】考试题库及低压电工考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工考试题库是安全生产模拟考试一点通总题库中生成的一套低压电工考试报名&#xff0c;安全生产模拟考试一点通上低压电工作业手机同步练习。2024年【低压电工】考试题库及低压电工考试报名 1、【单选题】()仪表…

C++之STL(六七)

1、变动性算法 #include <vector> #include <iostream> #include <list> #include <algorithm>using namespace std;void print_element(int n) {cout << n << ; }void add_3(int& n) {n n 3; }int fun(int n) {return 2 * n; }boo…

麻了!一觉醒来,代码全挂了。。

作为⼀名程序员&#xff0c;相信大家平时都有代码托管的需求。 相信有不少同学或者团队都习惯把自己的代码托管到GitHub平台上。 但是GitHub大家知道&#xff0c;经常在访问速度这方面并不是很快&#xff0c;有时候因为网络问题甚至根本连网站都打不开了&#xff0c;所以导致…

python创建websocket服务器,实现循环发送消息

WebSocket协议是在2008年由Web应用程序设计师和开发人员创建的&#xff0c;目的是为了在Web浏览器和服务器之间提供更高效、更低延迟的双向通信。它允许客户端和服务器在任何时候发送消息&#xff0c;无需重新建立TCP连接。WebSocket可以在Web浏览器和服务器之间传输文本和二进…

Linux命令----wc,uniq,sort的用法

1.wc的用法&#xff1a;wc 命令用于计算文件中的行数、单词数和字节数。 常用选项 -l&#xff1a;只显示行数-w&#xff1a;只显示单词数-c&#xff1a;只显示字节数-m&#xff1a;只显示字符数&#xff08;与 -c 类似&#xff0c;但处理多字节字符&#xff09;-L&#xff1a…

吴恩达机器学习 第三课 week1 无监督学习算法(下)

目录 01 学习目标 02 异常检测算法 2.1 异常检测算法的概念 2.2 基于高斯模型的异常检测 03 利用异常检测算法检测网络服务器的故障 3.1 问题描述 3.2 算法实现 3.3 问题升级 04 总结 01 学习目标 &#xff08;1&#xff09;理解异常检测算法&#xff08;Anomaly Det…

线程也不是越多越好,多少是好?

前面我们评估了不同大小基因组构建索引所需的计算资源和时间资源和不同大小数据集比对所需的计算资源和时间资源。 下面我们进一步看下不同线程数的影响。 测试电脑配置 这是一个10核、20线程的处理器&#xff0c;主频2.8 G HZ&#xff0c;可超频到5.2 GhZ。 在Windows系统…

windows系统上nginx搭建文件共享

1、下载windows版nginx 下载地址 2、配置nginx 编辑nginx.conf配置文件 在http模块下添加这个参数 underscores_in_headers on;#修改location内容&#xff0c;共享哪个文件夹&#xff0c;就写哪个文件夹&#xff0c;最后一定要跟上/&#xff0c;否则无法访问 location / {…

Java内存模型中的“可见性”、“原子性”、“有序性”,它们如何影响多线程程序的行为?

在Java内存模型&#xff08;Java Memory Model, JMM&#xff09;中&#xff0c;“可见性”、“原子性”和“有序性”是确保多线程程序正确执行的三个核心概念。它们直接影响到多线程环境下数据的一致性和程序的行为。 可见性&#xff08;Visibility&#xff09; 概念&#xf…

Android 大话binder通信 (下)

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章 前情提要 Android 大话binder通信 (上)主要介绍了矮挫丑进程一直暗恋白富美进程&#xff0c;遂发送情书给她&#xff0c;以表达对她的爱慕之情&#xff0c;而情书顺利的到达…

NFTScan | 06.17~06.23 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.06.17~ 2024.06.23 NFT Hot News 01/ Slerf 将向其 NFT 持有者空投&#xff0c;快照将在几小时内拍摄 6 月 17 日&#xff0c;Slerf 宣布将为其 NFT 持有者准备空投&#xff0c;快…

[C++]24:异常和智能指针

异常和智能指针 一.异常1.C/C的错误&#xff1a;1.C2.C3.三个关键字&#xff1a; 2.使用异常&#xff1a;1.基本概念&#xff1a;2.基本代码&#xff1a;1.基本使用&#xff1a;2.多个捕获&#xff1a;3.任意类型异常的捕获&#xff1a;4.异常的重新抛出&#xff1a; 3.异常安全…

RK3568技术笔记十八 Linux GPIO驱动程序中设备树分析

这段代码是RK3568芯片的设备树&#xff08;Device Tree&#xff09;片段&#xff0c;用于描述GPIO控制器的配置。 pinctrl: pinctrl { compatible "rockchip,rk3568-pinctrl"; // 兼容性字符串&#xff0c;指定此设备树节点适用于RK3568的引脚控制器 rockchip,grf…

汽车信息安全--HSM和TEE的区别

目录 HSM TEE TEE 和 HSM 技术特点与主要应用场景 TEE 和 HSM 相结合的方案 TEE 和 HSM 在车端的分布 HSM HSM指Hardware Security Module&#xff0c;它是一种有自己独立的CPU、密码算法硬件加速器、独立Flash等&#xff0c;用于生成、存储和管理加密密钥&#xff0c;以…

2024年商业管理与金融创新国际会议(BMFI 2024)

2024年商业管理与金融创新国际会议&#xff08;BMFI 2024&#xff09; 2024 International Conference on Business Management and Financial Innovation 【重要信息】 大会地点&#xff1a;上海 大会官网&#xff1a;http://www.icbmfi.com 投稿邮箱&#xff1a;icbmfisub-co…