C#实现高斯模糊(图像处理)

在C#中实现高斯模糊,可以使用System.Drawing库。高斯模糊是一种基于高斯函数的滤波器,它可以有效地平滑图像。以下是详细的步骤,包括生成高斯核并应用到图像上的代码示例。

1. 生成高斯核

首先,我们需要编写一个方法来生成高斯核。

public static float[,] CreateGaussianKernel(int length, float weight)
{float[,] kernel = new float[length, length];float sumTotal = 0;int kernelRadius = length / 2;float distance = 0;float calculatedEuler = 1.0f / (2.0f * (float)Math.PI * weight * weight);for (int filterY = -kernelRadius; filterY <= kernelRadius; filterY++){for (int filterX = -kernelRadius; filterX <= kernelRadius; filterX++){distance = ((filterX * filterX) + (filterY * filterY)) / (2 * (weight * weight));kernel[filterY + kernelRadius, filterX + kernelRadius] = calculatedEuler * (float)Math.Exp(-distance);sumTotal += kernel[filterY + kernelRadius, filterX + kernelRadius];}}for (int y = 0; y < length; y++){for (int x = 0; x < length; x++){kernel[y, x] = kernel[y, x] * (1.0f / sumTotal);}}return kernel;
}
2. 应用卷积滤波器

编写一个方法来应用卷积滤波器,将高斯核应用到图像上。

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] = 255; // Alpha channel}}}sourceImage.UnlockBits(srcData);resultImage.UnlockBits(resultData);return resultImage;
}
3. 使用高斯模糊处理图像

最后,编写一个程序来加载图像、应用高斯模糊滤波器,并保存处理后的图像。

using System;using System.Drawing;using System.Drawing.Imaging;
class Program
{static void Main(){// 加载原始图像Bitmap sourceImage = new Bitmap("path_to_your_image.jpg");// 创建高斯核float weight = 1.0f;int kernelSize = 5; // 核大小可以根据需要调整float[,] kernel = CreateGaussianKernel(kernelSize, weight);// 应用高斯模糊滤波器Bitmap resultImage = ApplyConvolutionFilter(sourceImage, kernel);// 保存处理后的图像resultImage.Save("path_to_save_filtered_image.jpg");}public static float[,] CreateGaussianKernel(int length, float weight){float[,] kernel = new float[length, length];float sumTotal = 0;int kernelRadius = length / 2;float distance = 0;float calculatedEuler = 1.0f / (2.0f * (float)Math.PI * weight * weight);for (int filterY = -kernelRadius; filterY <= kernelRadius; filterY++){for (int filterX = -kernelRadius; filterX <= kernelRadius; filterX++){distance = ((filterX * filterX) + (filterY * filterY)) / (2 * (weight * weight));kernel[filterY + kernelRadius, filterX + kernelRadius] = calculatedEuler * (float)Math.Exp(-distance);sumTotal += kernel[filterY + kernelRadius, filterX + kernelRadius];}}for (int y = 0; y < length; y++){for (int x = 0; x < length; x++){kernel[y, x] = kernel[y, x] * (1.0f / sumTotal);}}return kernel;}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] = 255; // Alpha channel}}}sourceImage.UnlockBits(srcData);resultImage.UnlockBits(resultData);return resultImage;}
}
图像对比
  • 原图:
    在这里插入图片描述
  • 处理后:
    在这里插入图片描述
注意事项
  • 确保路径 path_to_your_image.jpg 和 path_to_save_filtered_image.jpg 是正确的。
  • 调整高斯核的大小和权重以获得所需的模糊效果。
  • System.Drawing。

通过上述步骤,你可以在C#中实现图像的高斯模糊,对图像进行高斯模糊。

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

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

相关文章

Node.js 渲染三维模型并导出为图片

Node.js 渲染三维模型并导出为图片 1. 前言 本文将介绍如何在 Node.js 中使用 Three.js 进行 3D 模型渲染。通过结合 gl 和 canvas 这两个主要依赖库&#xff0c;我们能够在服务器端实现高效的 3D 渲染。这个方法解决了在服务器端生成和处理 3D 图形的需求&#xff0c;使得可…

【mysql】常用操作:维护用户/开启远程/忘记密码/常用命令

一、维护用户 1.1 创建用户 -- 语法 > CREATE USER [username][host] IDENTIFIED BY [password];-- 例子&#xff1a; -- 添加用户user007&#xff0c;密码123456&#xff0c;并且只能在本地可以登录 > CREATE USER user007localhost IDENTIFIED BY 123456; -- 添加用户…

一文搞懂Linux信号【下】

目录 &#x1f6a9;引言 &#x1f6a9;阻塞信号 &#x1f6a9;信号保存 &#x1f6a9;信号捕捉 &#x1f6a9;操作信号集 1.信号集操作函数 2.其它操作函数 &#x1f6a9;总结&#xff1a; &#x1f6a9;引言 在观看本博客之前&#xff0c;建议大家先看一文搞懂Linux信…

Star、Star求Star

本章是介绍博主自己的一个小工具的。使用的PythonPyQt5开发的。顺带来求一波star&#x1f31f;&#x1f31f;&#xff01;&#xff01;&#xff01; 地址&#xff1a;https://gitee.com/qinganan_admin/PyCom Pycom是博主开发的串口工具&#xff0c;要是说对比其他串口工具&…

Flutter GetX 状态管理 响应式编程(三)

在2021年4月初&#xff0c;我们在应用开发中大量使用了 GetX&#xff0c;目前看来效果还不错&#xff0c;于是我最近也出了一套GetX的从入门到源码原理的分析教程&#xff0c;欢迎大家关注更新。 【1 GetX 基本使用路由管理】【2 GetX 使用入门 程序计数器】 第一步 使用 GetM…

可灵王炸更新,图生视频、视频续写,最长可达3分钟!Runway 不香了 ...

现在视频大模型有多卷&#xff1f; Runway 刚在6月17号 发布Gen3 &#xff0c;坐上王座没几天&#xff1b; 可灵就在6月21日中午&#xff0c;重新夺回了王座&#xff01;发布了图生视频功能&#xff0c;视频续写功能&#xff01; 一张图概括&#xff1a; 二师兄和团队老师第一…

实施高效冷却技术:确保滚珠丝杆稳定运行!

滚珠丝杆在运行过程中&#xff0c;由于摩擦、惯性力等因素&#xff0c;会产生一定的热量&#xff0c;当热量无法及时散发时&#xff0c;滚珠丝杆的温度就会升高&#xff0c;会直接影响滚珠丝杆的精度和稳定性&#xff0c;从而影响最终的产品质量。为了让滚珠丝杆保持应有的精度…

Redis源码学习:ziplist的数据结构和连锁更新问题

ziplist ziplist 是 Redis 中一种紧凑型的列表结构&#xff0c;专门用来存储元素数量少且每个元素较小的数据。它是一个双端链表&#xff0c; 可以在任意一端进行压入/弹出操作&#xff0c;并且该操作的时间复杂度为O(1)。 ziplist数据结构 <zlbytes><zltail>&l…

Linux基础指令(三)

目录 shell 权限指令&#xff1a; 文件的操作权限&#xff1a; 对文件进行操作的用户分类&#xff1a; 用户对文件进行的操作分类&#xff1a; 所有者、所属组、其他的访问权限&#xff1a; 创建用户 沾滞位 匹配查找指令&#xff1a; grep find shell shell&#x…

Ubuntu22.04开机后发现IP地址变成127.0.0.1

开机就是这个样子 解决办法 ip地址可能被释放&#xff0c;需要重新设置成自动分配 sudo dhclient -v可能网卡未加托管 查看方式: nmcli n若是enable就是已被托管,若是disabled&#xff0c;说明网卡未被托管 解决办法: nmcli n on搞定

DataWhale - 吃瓜教程学习笔记(二)

学习视频&#xff1a;第3章-一元线性回归_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 3.1 - 3.2 一元线性回归 - 最小二乘法 - 极大似然估计 - 梯度 多元函数的一阶导数 - 海塞矩阵 多元函数的二阶导数 - 机器学习三要素

软件介绍—Fluent Reader (RSS阅读器)

软件介绍—Fluent Reader &#xff08;RSS阅读器&#xff09; 01 RSS介绍 RSS可翻译为简易信息聚合&#xff08;也叫聚合内容&#xff09;是一种基于XML的标准&#xff0c;在互联网上被广泛采用的内容包装和投递协议。简单来讲&#xff0c;就是可以“订阅”一些网站新发布的内…

Android 开发Android Studio创建第一个Android应用

本文讲解如何Android Studio创建第一个Android应用。 启动Android Studio 或打开的项目的界面 点击File-New-New Project 选择“ Empty Views Activity”&#xff0c;点击Next 点击Next&#xff0c;项目创建完成如下&#xff1a; 创建项目完成&#xff0c;自带一个Activity。 …

FreeRTOS消息队列

队列简介 更详细的操作入下图所示&#xff1a; 传输数据的方法 FreeRTOS中的队列传输使用的是拷贝&#xff1a;把数据、把变量的值复制进队列里 FreeRTOS 使用拷贝值的方法&#xff0c;这更简单&#xff1a; &#xff08;1&#xff09; 局部变量的值可以发送到队列中&#…

linux最大线程数限制及打开最大文件数

1.root用户下执行 ulimit -a 然后查看 max user processes 这个值通常是系统最大线程数的一半 max user processes&#xff1a;当前用户同时打开的进程(包括线程)的最大个数为 2.普通用户下 ulimit -a 出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.co…

PHP环境搭建之使用PhpStudy

文章目录 1 PhpStudy1.1 简介1.2 下载&安装1.3 修改配置1.3.1 Apache配置1.3.2 MySQL配置1.3.3 MySQL启动问题 1.4 Composer1.4.1 简介1.4.2 下载安装1.4.3 修改配置1.4.4 使用命令 1 PhpStudy 1.1 简介 phpstudy是一个php运行环境的集成包&#xff0c;用户不需要去配置运…

KIVY BLOG Kivy tutorial 007: Introducing kv language

Kivy tutorial 007: Introducing kv language – Kivy Blog DECEMBER 18, 2019 BY ALEXANDER TAYLOR Kivy tutorial 007: Introducing kv language Kivy 导师课007&#xff1a; 介绍kv语言 Central themes: kv language, building a gui, integration with Python 中心主题:…

路由模式--哈希模式下使用a标签跳转会有问题

路由模式分为 history 和 hash 两种模式&#xff0c;在 hash 模式下&#xff0c;使用 a 标签去跳转路由&#xff0c;可能会有问题。 比如&#xff1a; <a href"/home"><img src"/logo.png" class"logo" /></a> 在跳转路由时…

神经网络学习6-线性层

归一化用的较少 正则化用来解决过拟合&#xff0c;处理最优化问题&#xff0c;批量归一化加快速度 正则化&#xff08;Regularization&#xff09;&#xff1a; 作用&#xff1a;正则化是一种用来防止过拟合的技术&#xff0c;通过向模型的损失函数中添加惩罚项&#xff0c;使…

【Mysql】SQL约束、主键约束、非空、唯一、外键约束

SQL约束 什么是约束: 对表中的数据进行进一步的限制&#xff0c;从而保证数据的正确性、有效性、完整性. 违反约束的不正确数据,将无法插入到表中。 常见的约束 约束名 约束关键字 主键 primary key 唯一 unique 非空 not null 外键 foreign key 2.1 主键约束 什么是主键约束&a…