当前位置: 首页 > news >正文

C#实现边缘锐化(图像处理)

在 C# 中进行图像的边缘锐化,可以通过卷积滤波器实现。边缘锐化的基本思想是通过卷积核(也称为滤波器或掩模)来增强图像中的边缘。我们可以使用一个简单的锐化核,例如:

[ 0, -1,  0][-1,  5, -1][ 0, -1,  0]

这个卷积核可以用于增强图像中的边缘。下面是如何在 C# 中实现这一操作的完整代码,包括加载图像、应用锐化滤波器和保存结果图像。

1. 安装 System.Drawing.Common

确保你已经安装了 System.Drawing.Common 库。你可以通过NuGet包管理器安装它,或者使用以下命令:

dotnet add package System.Drawing.Common
2. 编写卷积滤波器应用方法
using System;using System.Drawing;using System.Drawing.Imaging;
public class ImageProcessor
{public static Bitmap ApplyConvolutionFilter(Bitmap sourceImage, float[,] kernel){int width = sourceImage.Width;int height = sourceImage.Height;BitmapData srcData = sourceImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);Bitmap resultImage = new Bitmap(width, height);BitmapData resultData = resultImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);int bytesPerPixel = 4;int stride = srcData.Stride;IntPtr srcScan0 = srcData.Scan0;IntPtr resultScan0 = resultData.Scan0;int kernelWidth = kernel.GetLength(1);int kernelHeight = kernel.GetLength(0);int kernelOffset = kernelWidth / 2;unsafe{byte* srcPtr = (byte*)srcScan0.ToPointer();byte* resultPtr = (byte*)resultScan0.ToPointer();for (int y = kernelOffset; y < height - kernelOffset; y++){for (int x = kernelOffset; x < width - kernelOffset; x++){float blue = 0.0f;float green = 0.0f;float red = 0.0f;for (int ky = -kernelOffset; ky <= kernelOffset; ky++){for (int kx = -kernelOffset; kx <= kernelOffset; kx++){int pixelPos = ((y + ky) * stride) + ((x + kx) * bytesPerPixel);blue += srcPtr[pixelPos] * kernel[ky + kernelOffset, kx + kernelOffset];green += srcPtr[pixelPos + 1] * kernel[ky + kernelOffset, kx + kernelOffset];red += srcPtr[pixelPos + 2] * kernel[ky + kernelOffset, kx + kernelOffset];}}int resultPos = (y * stride) + (x * bytesPerPixel);resultPtr[resultPos] = (byte)Math.Min(Math.Max(blue, 0), 255);resultPtr[resultPos + 1] = (byte)Math.Min(Math.Max(green, 0), 255);resultPtr[resultPos + 2] = (byte)Math.Min(Math.Max(red, 0), 255);resultPtr[resultPos + 3] = srcPtr[resultPos + 3]; // Copy alpha channel}}}sourceImage.UnlockBits(srcData);resultImage.UnlockBits(resultData);return resultImage;}
}
3. 使用卷积滤波器进行边缘锐化

编写一个主程序来加载图像、应用锐化滤波器并保存结果图像。

using System;using System.Drawing;
class Program
{static void Main(){// 加载原始图像Bitmap sourceImage = new Bitmap("path_to_your_image.jpg");// 定义锐化卷积核float[,] sharpenKernel = new float[,]{{ 0, -1,  0 },{ -1,  5, -1 },{ 0, -1,  0 }};// 应用锐化滤波器Bitmap resultImage = ImageProcessor.ApplyConvolutionFilter(sourceImage, sharpenKernel);// 保存处理后的图像resultImage.Save("path_to_save_sharpened_image.jpg");}
}
图像对比:
  • 原图:
    在这里插入图片描述
  • 处理后:
    在这里插入图片描述
注意事项
  • 确保路径 path_to_your_image.jpg 和 path_to_save_sharpened_image.jpg 是正确的。
  • 调整卷积核可以改变锐化效果。上面使用的是一个常见的锐化卷积核。
  • System.Drawing 命名空间需要 System.Drawing.Common 包,在 .NET Core 或 .NET 5/6 中需要特别注意包的引用。

通过这些步骤,你可以在 C# 中实现图像的边缘锐化。这个实现使用了卷积滤波器来增强图像的边缘,从而使图像更加清晰。

相关文章:

C#实现边缘锐化(图像处理)

在 C# 中进行图像的边缘锐化&#xff0c;可以通过卷积滤波器实现。边缘锐化的基本思想是通过卷积核&#xff08;也称为滤波器或掩模&#xff09;来增强图像中的边缘。我们可以使用一个简单的锐化核&#xff0c;例如&#xff1a; [ 0, -1, 0][-1, 5, -1][ 0, -1, 0]这个卷积核…...

ffmpeg windows系统详细教程

视频做预览时黑屏&#xff0c;但有声音问题解决方案。 需要将 .mp4编成H.264格式的.mp4 一般上传视频的站点&#xff0c;如YouTube、Vimeo 等&#xff0c;通常会在用户上传视频时自动对视频进行转码&#xff0c;以确保视频能够在各种设备和网络条件下流畅播放。这些网站通常…...

【单片机】MSP430G2553单片机 Could not find MSP-FET430UIF on specified COM port 解决方案

文章目录 MSP430G2553开发板基础知识解决办法如何实施解决办法4步骤一步骤二步骤三 MSP430G2553开发板基础知识 MSP430G2553开发板如下图&#xff0c;上半部分就是UIF程序下载调试区域的硬件。个人觉得MSP430G2553开发板的这个部分没有做好硬件设计&#xff0c;导致很多系统兼…...

每日一题——力扣104. 二叉树的最大深度(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 目录 我的写法 代码功能 代码结构 时间复杂度分析 空间复杂度分析 总结 我要更强 优化方法&#xff1a;迭代&…...

wpf textbox 有焦点 导致后台更新 前台不跟着改变

这个问题可能是由于 WPF 的数据绑定机制导致的。当 TextBox 有焦点时,它会独立于数据绑定进行更新,这可能会导致前台界面不能及时反映后台数据的变化。 1.使用 UpdateSourceTrigger 属性: 在数据绑定时,将 UpdateSourceTrigger 属性设置为 PropertyChanged。这样当 TextBox 的…...

数字化物资管理系统的未来:RFID技术的创新应用

在信息化和智能化不断发展的背景下&#xff0c;物资管理系统的数字化转型已成为各行各业关注的焦点。RFID技术作为一种先进的物联网技术&#xff0c;通过全面数字化实现物资信息的实时追踪和高效管理&#xff0c;为企业的物资管理提供了强有力的支持。 首先&#xff0c;RFID技…...

【docker】常用指令-表格整理

以下列出的指令是Docker中常用的命令&#xff0c;但并不是全部。Docker的指令非常丰富&#xff0c;可以根据具体的需求和场景选择合适的指令。同时&#xff0c;每个指令都有很多选项和参数可以使用&#xff0c;可以通过 docker COMMAND --help 来获取更详细的信息。 一、容器命…...

洛谷——P2824 排序

题目来源&#xff1a;[HEOI2016/TJOI2016] 排序 - 洛谷https://www.luogu.com.cn/problem/P2824 问题思路 本文介绍一种二分答案的做法&#xff0c;时间复杂度为&#xff1a;(nm)*log(n)*log(n).本题存在nlog(n)的做法&#xff0c;然而其做法没有二分答案的做法通俗易懂. 默认读…...

echart在线图表demo下载直接运行

echart 全面的数据可视化图表解决方案 | 折线图、柱状图、饼图、散点图、水球图等各类图表展示 持续更新中 三色带下表题速度仪表盘 地图自定义图标 动态环形图饼状图 动态水波动圆形 多标题指针仪表盘 温度仪表盘带下标题 横向柱状图排名 环形饼状图 双折线趋势变化...

MLX5_SET_TO_ONES宏解析

看代码时&#xff0c;遇到一个非常复杂的宏MLX5_SET_TO_ONES&#xff0c;这个宏的主要作用是对特定的数据结构置位&#xff0c;宏的上下文如下&#xff1a; #define __mlx5_nullp(typ) ((struct mlx5_ifc_##typ##_bits *)0) #define __mlx5_bit_off(typ, fld) (offsetof(struc…...

SQL Server入门-SSMS简单使用(2008R2版)-1

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 参考&#xff1a; SQL Server 新建数据库 - 菜鸟教程 https://www.cainiaoya.com/sqlserver/sql-server-create-db.html 第 2 课&#xff1a;编写 Transact-SQL | Microsoft Learn https://learn.microsoft.com/zh-cn/…...

高考专业抉择探索计算机专业的未来展望及适合人群

身份&#xff1a;一位正在面临人生重要抉择的高考生&#xff0c;一位计算机行业从业者  正文&#xff1a;  随着2024年高考落幕&#xff0c;我与数百万高三学生一样&#xff0c;又将面临人生中的重要抉择&#xff1a;选择大学专业。对于许多学生来说&#xff0c;计算机科学…...

windows安装spark

在 Windows 上安装 Spark 并进行配置需要一些步骤&#xff0c;包括安装必要的软件和配置环境变量。以下是详细的步骤指南&#xff1a; 步骤一&#xff1a;安装 Java 下载和安装 Java Development Kit (JDK) 到 Oracle JDK 下载页面 或 OpenJDK 下载页面 下载适合你系统的 JDK。…...

【信息学奥赛】CSP-J/S初赛03 计算机网络与编程语言分类

第1节 计算机网络基础 1.1 网络的定义 所谓计算机网络&#xff0c;就是利用通信线路和设备&#xff0c;把分布在不同地理位置上的多台计算机连 接起来。计算机网络是现代通信技术与计算机技术相结合的产物。 网络中计算机与计算机之间的通信依靠协议进行。协议是计算机收、发…...

python20 函数的定及调用

函数的定及调用 函数是将一段实现功能的完整代码&#xff0c;使用函数名称进行封装&#xff0c;通过函数名称进行调用。以此达到一次编写&#xff0c;多次调用的目的 用 def 关键字来声明 函数 格式&#xff1a; def 函数名(参数列表):函数体[:return 返回值是可选的&#xff0…...

【Android WebView】WebView基础

一、简介 WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核&#xff0c;4.4后直接使用了Chrome。 二、重要类 以WebView类为基础&#xff0c;WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加…...

Python酷库之旅-第三方库openpyxl(03)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…...

电脑丢失dll文件一键修复的方法有哪些?分析dll文件修复的多种策略

我们经常会遇到各种各样的问题&#xff0c;其中之一就是DLL文件的丢失。DLL文件&#xff08;动态链接库&#xff09;是操作系统和应用程序正常运行所必需的文件&#xff0c;当这些文件丢失或损坏时&#xff0c;可能会导致软件无法正常启动&#xff0c;甚至影响系统的稳定性。对…...

小程序项目业务逻辑回忆4

用户查询积分 积分获取规则如下: 邀请其他用户购票参会,将获取该用户花费金额的10%获取积分。 邀请用户注册参观展览&#xff0c;需注册并现场签到&#xff0c;将获取10分的奖励积分。 邀请企业用户参展&#xff0c;将获取企业参展金额的5%获取到积分。 上述3条积分获取规…...

LeetCode 16.最接近的三数之和(C++)

链接 https://leetcode.cn/problems/3sum-closest/description/ 题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例1 输入&a…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...