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

news2024/11/24 20:03:08

在 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# 中实现图像的边缘锐化。这个实现使用了卷积滤波器来增强图像的边缘,从而使图像更加清晰。

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

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

相关文章

【Deep Learning】Meta-Learning:训练训练神经网络的神经网络

元学习&#xff1a;训练训练神经网络的神经网络 本文基于清华大学《深度学习》第12节《Beyond Supervised Learning》的内容撰写&#xff0c;既是课堂笔记&#xff0c;亦是作者的一些理解。 1 Meta-Learning 在经典监督学习中&#xff0c;给定训练数据 { ( x i , y i ) } i \{…

javaSE字符串学习笔记

API和API帮助文档 API API(Application Programming Interface)&#xff1a;应用程序编程接口简单理解&#xff1a;API酒啊别人已经写好的东西&#xff0c;我们不需要自己编写&#xff0c;直接使用即可。 API这个术语在编程圈中非常常见.我第一次接触API这个词语是在大一下。老…

【会议征稿,IEEE出版】第三届机器人、人工智能与智能控制国际会议(RAIIC 2024,7月5-7)

第三届机器人、人工智能与智能控制国际会议&#xff08;RAIIC 2024&#xff09;将于2024年7月5-7日中国绵阳举行。 RAIIC 2024是汇聚业界和学术界的顶级论坛&#xff0c;会议将邀请国内外著名专家就以传播机器人、人工智能与智能控制领域的技术进步、研究成果和应用做专题报告…

vs工程添加属性表

一、简介 1、 vs工程属性表以&#xff08;.props&#xff09;为后缀 2、 作用&#xff1a;当多个工程需要配置很多相同的属性配置时方便同步&#xff0c;比如多个工程需要链接相同的头文件&#xff0c;库文件&#xff0c;输出路径&#xff0c;中间目录等 3、本章内容测试环境&a…

Web渗透-SSRF服务端请求伪造

SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请求伪造&#xff09;是一种由攻击者利用漏洞服务器发送恶意请求的攻击方式。SSRF漏洞通常出现在服务器端的web应用中&#xff0c;应用允许用户提供的输入被服务器用来发起请求&#xff0c;而没有对输入进行充…

数据结构:为什么说链表是顺序表的升级版(c语言实现)

前言&#xff1a; 我们在之前的几篇文章中详细的讲解了顺序表的特点&#xff0c;增删改查操作和动态顺序表的优点&#xff0c;并使用顺序表的底层结构实现了通讯录项目&#xff0c;似乎顺序表是一个非常完美的数据结构&#xff0c;它可以实现按照需求实现增删查改&#xff0c;对…

换电脑后导入git本地仓库记录

导入本地仓库tig记录 换了新电脑&#xff0c;将旧电脑的数据盘查到新的笔记本之后发现&#xff0c;使用pycharm 读取不到本地的git提交记录了&#xff0c;我没有将本地git上传到远程仓库的习惯&#xff0c;这可抓马了&#xff0c;硬盘插回去的话也太麻烦了。试了 vscode 提示设…

冲击2024年CSDN博客之星TOP1:CSDN文章质量分查询在哪里?

文章目录 一&#xff0c;2023年博客之星规则1&#xff0c;不高的入围门槛2&#xff0c;[CSDN博文质量分测评地址](https://www.csdn.net/qc) 二&#xff0c;高分秘籍1&#xff0c;要有目录2&#xff0c;文章长度要足够&#xff0c;我的经验是汉字加代码至少1000字。3&#xff0…

币旺BitonAI系统助力智能化交易 引领加密资产交易行业革新

随着加密货币市场的蓬勃发展&#xff0c;交易者们面临着市场波动、信息过载和日益激烈的竞争等多重挑战。在这样的背景下&#xff0c;智能化交易系统应运而生。AI技术的引入无疑为加密货币交易市场带来了一场革命性的变革。通过深度学习和大数据分析&#xff0c;加密货币交易成…

手机怎么自动切换ip地址

在数字化时代&#xff0c;网络IP地址不仅是设备在网络世界的标识&#xff0c;也是确保用户网络安全和数据隐私的关键因素。对于手机用户来说&#xff0c;在某些情境下可能需要自动切换IP地址&#xff0c;本文将为您介绍手机怎么自动切换IP地址。 随着网络技术的发展&#xff0c…

Claude 3.5 强势出击:解析最新AI模型的突破与应用

近年来&#xff0c;人工智能领域的发展迅猛&#xff0c;各大科技公司纷纷推出了自家的高级语言模型。在这场技术竞赛中&#xff0c;Anthropic的Claude系列模型凭借其强大的性能和创新的功能脱颖而出。最近&#xff0c;Anthropic发布了Claude 3.5 Sonnet模型&#xff0c;引起了广…

Vue73-命名路由

一、路由的name属性 二、小结

【机器学习】正则卷积群理论及Python代码实现

1. 引言 1.1.卷积神经网络CNN 卷积神经网络&#xff08;CNN&#xff09;的数学模型是深度学习中用于处理图像和其他高维数据的关键组成部分。那么&#xff0c;CNN究竟是什么呢&#xff1f; 总结起来&#xff0c;CNN网络主要完成以下操作&#xff1a; 卷积操作&#xff08;Co…

使用Naive UI的级联选择器 Cascader进行省市区选择

序言&#xff1a; 在进行PC版的功能开发时&#xff0c;进行客户管理时老板要让客户便捷的选择自己的省市区等信息&#xff0c;而不是让他们一个个去填写&#xff0c;这时就需要使用级联选择器来进行省市区的选择。 注&#xff1a;element ui/plus的级联选择器也是可以的。 步骤…

Master PDF Editor v5 解锁版安装教程(小巧多功能PDF )

前言 Master PDF Editor&#xff0c;小巧的多功能PDF编辑器&#xff0c;轻松查看&#xff0c;创建&#xff0c;修改&#xff0c;批注&#xff0c;签名&#xff0c;扫描&#xff0c;OCR和打印PDF文档。高级注释工具&#xff0c;可以添加任意便笺指示对象突出显示&#xff0c;加…

Redis单例部署

目录 1. 概述2. 参考3. 环境4. 部署4.1 操作系统4.1.1 修改系统参数4.1.2 关闭透明大页内存4.1.3 修改系统限制 4.2 安装Redis4.2.1 下载Redis4.2.2 创建redis账号4.2.3 添加Redis环境变量4.2.4 创建Redis使用目录4.2.5 安装Redis4.2.6 手动修改配置文件&#xff08;**可跳过&a…

Linux连接工具MobaXterm详细使用教程

目录 一、MobaXterm的下载 1、访问官网 2、下载便携版 3、启动MobaXterm 二、MobaXterm基本使用设置 1、新建会话 2、使用ssh连接第一个会话 3、设置主密码 4、主界面 5、sftp文件上传下载 6、文件拖拽的上传下载 7.右键粘贴 8、查看服务器监测信息​编辑 9、个…

在Linux下使用CMake加载自定义路径第三方库的指南

CMake是一个强大的跨平台构建系统&#xff0c;广泛应用于C项目中。它不仅能够处理标准的构建过程&#xff0c;还可以灵活地集成各种第三方库&#xff0c;包括自定义路径的库、已编译的共享库&#xff08;.so 文件&#xff09;&#xff0c;以及仅包含头文件的库&#xff08;如Ei…

qt 简单实验创建一个可以拖拽和缩放的矩形

1.概要 2.代码 2.1 resizablewidget.h #ifndef RESIZABLEWIDGET_H #define RESIZABLEWIDGET_H#include <QWidget> #include <QMouseEvent>class ResizableWidget: public QWidget {Q_OBJECT public:ResizableWidget(QWidget *parent nullptr); protected:void m…

IPD笔记

IPD笔记 先弄一个一图流&#xff0c;改天再过来继续补充 IPD&#xff08;Integrated Product Development&#xff09;即集成产品开发&#xff0c;是一套产品开发的模式、理念与方法。华为的IPD的核心思想是基于市场需求&#xff0c;将产品开发作为一项投资来管理&#xff0c;以…