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

嗨,我是射手座的程序媛,期待和大家更多的交流与学习,欢迎添加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; // 根据经验设定 sigmadouble 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.mzph.cn/bicheng/32959.shtml

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

相关文章

Java项目:基于SSM框架实现的助学贷款管理系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的助学贷款管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

03--MySQL数据库概述

目录 第13章 DML 13.1 添加语句 &#xff08;1&#xff09;添加一条记录到某个表中 &#xff08;2&#xff09;添加一条记录到某个表中 &#xff08;3&#xff09;添加多条记录到某个表中 &#xff08;4&#xff09;示例演示 13.2 修改语句 修改所有行 修改部分行 13.…

python学习笔记-09

面向对象编程-中 面向对象三大特征&#xff1a;封装、继承、多态。 封装&#xff1a;把内容封装起来便于后面的使用。对于封装来讲&#xff0c;就是使用__init__方法将内容封装道对象中&#xff0c;然后通过对象直接或者self获取被封装的内容。 继承&#xff1a;子继承父的属…

Kubernetes之Deployment详解

如何更好的用好Deployment&#xff1f;本文尝试从Deployment的使用、控制器实现原理及使用规范3方面进行阐述。希望对您有所帮助&#xff01; 一、Kubernetes Deployment使用浅析 Kubernetes Deployment 是一种高级资源对象&#xff0c;用于声明和管理 Pod 和 ReplicaSet。它…

Java中的字符串操作技巧与最佳实践

Java中的字符串操作技巧与最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨Java中的字符串操作技巧与最佳实践。字符串操作是…

Uniapp在屏幕尺寸低于960出现样式错乱(开箱即用)

我司项目突然要做平板兼容,我在调试的时候发现当屏幕尺寸低于960px发现样式但凡是以rpx单位的全部失效&#xff0c;如果是以px为单位那么影响就比较小&#xff0c;当时解决方案是写了不少媒体查询和把单位rpx改成px&#xff0c;后面查阅文档发现大错特错宽屏适配只需一行代码即…

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 &#xff0c;Leetcode239: 滑动窗口最大值 目录 介绍 一、基础概念补充&#xff1a; 1.c字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull&#xff08;最常用&#xff09; 2. std::strings…

Python高级编程:机器学习基础

Python高级编程:机器学习基础 在前几篇文章中,我们探讨了Python的基础语法、面向对象编程、标准库、第三方库、并发编程、异步编程、网络编程与网络爬虫、数据库操作与ORM以及数据分析与数据可视化。在这篇文章中,我们将深入探讨Python在机器学习领域的应用。机器学习是人工…

04--MySQL8.0_JDBC

第一章 JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量、数组、集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系; 后来我们学习了数据库管理软件MySQL,可以方便的管理数据1。 那么如何将它俩结合起来呢?即…

《AI旋律:创意产业的重塑与共生》

AI乐章&#xff1a;技术革命下的创意产业新生态 在数字化浪潮的推动下&#xff0c;音乐创作领域迎来了前所未有的变革——AI音乐大模型的横空出世&#xff0c;犹如一颗石子投入平静的湖面&#xff0c;激起了层层涟漪。这些模型以令人难以置信的速度和多样性&#xff0c;将音乐…

学懂C#编程:常用高级技术——学会Lambda表达式的应用

Lambda表达式在C#中是一种简洁且强大的编写代码的方式&#xff0c;它主要用于创建匿名函数&#xff0c;也就是那些没有名字的函数。想象一下&#xff0c;你有时候需要快速写一个小功能&#xff0c;但又不想专门为此定义一个方法&#xff0c;Lambda表达式就是你的救星。下面我用…

【树形dp 换根法 BFS】2581. 统计可能的树根数目

本文涉及知识点 CBFS算法 动态规划汇总 图论知识汇总 树形dp 换根法 BFS LeetCode 2581. 统计可能的树根数目 Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges 表示&#xff0c;其中 edges[i] [ai, bi] &#xf…

linux的source命令

用法 source file 也可以用.空格file来代替 . file 作用 在当前bash环境下读取并执行FileName中的命令. source(或点)令通常用于重新执行刚修改的初始化文档&#xff0c;如 .bash_profile 和 .profile等配置文件. 简单的说就是: source命令会把file里的命令在当前shell里一…

《书生·浦语大模型实战营》第5课 学习笔记:LMDeploy 量化部署 LLM 实践

文章大纲 0.背景知识与简介计算机组成原理&#xff1a;变量的存储参数量与推理的关系 1.LMDeploy环境部署1.1 创建开发机1.2 创建conda环境InternStudio开发机创建conda环境&#xff08;推荐&#xff09;本地环境创建conda环境 1.3 安装LMDeploy 2.LMDeploy模型对话(chat)2.1 H…

【CSS in Depth2精译】1.2 继承~1.3 特殊值

文章目录 1.2 继承1.3 特殊值1.3.1 inherit 关键字1.3.2 initial 关键字1.3.3 unset 关键字1.3.4 revert 关键字 1.2 继承 除了层叠&#xff0c;还有一种给元素设置样式的方式&#xff1a;继承。经常有人把层叠与继承的概念弄混淆。它们虽然有关联&#xff0c;但也应该分辨清楚…

优化堆排序

优化堆排序 堆排序是一种基于比较的排序算法,它利用堆这种数据结构来进行排序。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序算法分为两个大的步骤:首先将待排序的序列构造成一个最大堆,此时,整个序…

在Linux/Ubuntu/Debian中使用 `tee` 命令将输出显示在终端并写入文件中

在Linux/Ubuntu/Debian中使用 tee 命令将输出显示在终端并写入文件中 在日常的 Linux 系统操作中&#xff0c;我们常常需要将命令的输出重定向到文件中以便于后续查看和处理。本文将通过几个常见示例&#xff0c;介绍如何使用 tee 命令来同时将输出显示在终端并写入文件中。 …

通用VS垂直,谁将领跑落地场景?或AI大模型的抉择与探索

随着人工智能技术的飞速发展&#xff0c;大模型已成为业界关注的焦点。在这个竞争激烈的战场中&#xff0c;通用大模型和垂直大模型各自展现出不同的优势&#xff0c;引发了业界的广泛讨论。那么&#xff0c;对于大模型的第一个赛点&#xff0c;你更青睐哪一方呢&#xff1f; …

创新实训(十二) 项目开发——历史对话增加查询功能

必要性 随着对话记录的增加&#xff0c;根据对话名称conv_name查询对话对用户来说非常有必要实现。 实现 原来的history_chats.vue中使用了getChatList() 在onMounted时直接获取用户的所有对话记录&#xff0c;如果要实现查询功能&#xff0c;需要增加两个变量&#xff1a; …