牛奶专业户 發表於 2026-1-6 14:28:00

C# 不依赖 OpenCV 的图像处理算法:滤波、锐化与边缘检测

<h2 id="前言">前言</h2>
<p>数字图像处理作为计算机视觉和多媒体技术的基础内容,其核心不仅在于理解算法原理,更在于动手实现与验证。为了深入掌握本项目选择从底层像素级别出发,使用C#语言手动实现各类经典图像处理算法,避免依赖现成的高级图像库。</p>
<p>这种"从零开始"的方式虽然开发成本较高,却能真正厘清每个操作背后的数学逻辑与工程细节,也为后续学习更复杂的视觉任务打下坚实基础。</p>
<h2 id="项目介绍">项目介绍</h2>
<p>项目是一个基于.NET 平台开发的桌面级数字图像处理工具,在通过图形化界面直观展示多种图像处理算法的效果。</p>
<p>整个系统围绕System.Drawing.Bitmap类开发,直接操作像素数据完成各类变换,涵盖几何操作、灰度调整、噪声模拟、滤波去噪、边缘检测、图像分割等多个模块。</p>
<p>项目代码结构清晰,功能完整,既可用于学习参考,也适合作为开发项目。</p>
<h2 id="项目功能">项目功能</h2>
<p>1、支持图像的打开、保存及基本信息显示(如尺寸、颜色深度等)</p>
<p>2、提供灰度化转换与灰度直方图可视化功能</p>
<p>3、实现基本几何变换:旋转、放大、缩小、错切</p>
<p>4、支持线性灰度变换与直方图均衡化以增强图像对比度</p>
<p>5、可添加高斯噪声与椒盐噪声,并配套多种去噪滤波器</p>
<p>6、集成多种边缘检测算子:Roberts、Sobel、Laplacian、LoG、Wallis、双向梯度等</p>
<p>7、提供二值化处理及迭代阈值分割方法</p>
<p>8、包含二值图像后处理功能,如孤立点去除、轮廓提取、区域测量等</p>
<p>9、实现选择式掩膜滤波(LSMF)与KNN平滑滤波等进阶去噪策略<br>
10、内置完整的撤销(Undo)与重做(Redo)机制,便于操作回溯与效果对比</p>
<h2 id="项目特点">项目特点</h2>
<p>1、坚持从像素级别手动实现算法,不依赖OpenCV等封装库,强化原理理解</p>
<p>2、界面采用WPF构建,交互友好,参数输入动态生成,操作流程清晰</p>
<p>3、所有处理操作均可逆,支持多步历史记录,提升实验灵活性</p>
<p>4、代码模块化程度高,每个功能对应独立方法,便于阅读与扩展<br>
5、兼顾实用性,既能验证理论,也能处理真实图像任务</p>
<h2 id="项目技术">项目技术</h2>
<table>
<thead>
<tr>
<th>技术类别</th>
<th>具体说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>开发语言</td>
<td>C#</td>
</tr>
<tr>
<td>运行平台</td>
<td>.NET Framework(使用 <code>System.Drawing.Bitmap</code> 处理位图)</td>
</tr>
<tr>
<td>UI 框架</td>
<td>WPF(Windows Presentation Foundation)</td>
</tr>
<tr>
<td>图像数据访问</td>
<td>通过 <code>Bitmap.GetPixel</code> / <code>SetPixel</code> 及 <code>HBITMAP</code> 指针与 WPF <code>Image</code> 控件对接</td>
</tr>
<tr>
<td>关键算法实现</td>
<td>双线性插值(用于缩放/旋转)、卷积核运算(用于滤波与边缘检测)、直方图统计、噪声模型模拟等</td>
</tr>
<tr>
<td>辅助技术</td>
<td>使用 <code>Operation</code> 类封装操作历史,支持 Undo/Redo;通过 Interop 调用 Win32 API 实现位图转换</td>
</tr>
</tbody>
</table>
<h2 id="项目代码">项目代码</h2>
<h3 id="为图片添加高斯噪声">为图片添加高斯噪声</h3>
<pre><code class="language-csharp">/// &lt;summary&gt;
/// 为图片添加高斯噪声
/// &lt;/summary&gt;
private void GaussNoise(int k)
{
    Random ran = new Random(GetRandomSeed());
    Bitmap bmp_ = new Bitmap(bmp.Width, bmp.Height);
    for (int i = 0; i &lt; bmp.Width; i++)
    {
      for (int j = 0; j &lt; bmp.Height; j++)
      {
            double r1 = ran.NextDouble();
            double r2 = ran.NextDouble();
            double result = Math.Sqrt((-2) * Math.Log(r2)) * Math.Sin(2 * Math.PI * r1);
            result *= k;
            Color c = bmp.GetPixel(i, j);

            int rr = (int)(c.R + result),
                gg = (int)(c.G + result),
                bb = (int)(c.B + result);
            if (rr &gt; 255) rr = 255;
            else if (rr &lt; 0) rr = 0;
            if (gg &gt; 255) gg = 255;
            else if (gg &lt; 0) gg = 0;
            if (bb &gt; 255) bb = 255;
            else if (bb &lt; 0) bb = 0;
            bmp_.SetPixel(i, j, Color.FromArgb(c.A, rr, gg, bb));
      }
    }
    UpdateImg(ref bmp_);
}
</code></pre>
<h3 id="为图片添加椒盐噪声">为图片添加椒盐噪声</h3>
<pre><code class="language-csharp">/// &lt;summary&gt;
/// 为图片添加椒盐噪声
/// &lt;/summary&gt;
/// &lt;param name="SNR"&gt;信噪比&lt;/param&gt;
/// &lt;param name="pa"&gt;图片为暗点的概率&lt;/param&gt;
private void SaltNoise(double SNR, double pa)
{
    // 噪声点的数量
    int NP = (int)(bmp.Width * bmp.Height * (1 - SNR));
    Bitmap bmp_ = new Bitmap(bmp);
    Random rand = new Random();
    for (int i = 0; i &lt; NP; i++)
    {
      int r = rand.Next(0, bmp.Height), c = rand.Next(0, bmp.Width);
      double prob = rand.NextDouble();
      if (prob &gt; pa)
      {
            bmp_.SetPixel(c, r, Color.FromArgb(255, 255, 255));
      }
      else
      {
            bmp_.SetPixel(c, r, Color.FromArgb(0, 0, 0));
      }
    }
    UpdateImg(ref bmp_);
}
</code></pre>
<h2 id="项目效果">项目效果</h2>
<p>项目运行稳定,能够准确还原各类经典图像处理算法的预期效果。例如,在对自然图像进行灰度化后,直方图均衡化显著提升了整体对比度;添加椒盐噪声后,中值滤波有效抑制了噪点而保留边缘;使用Sobel或LoG算子可清晰提取物体轮廓。</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202601/576536-20260105210103962-1763205682.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202601/576536-20260105210118061-1765878502.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202601/576536-20260105210140975-938016934.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202601/576536-20260105210152223-942589643.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="总结">总结</h2>
<p>项目不仅是一次视觉的学习,更是一场对数字图像处理知识体系的深度实践。通过亲手编写每一个像素操作,可以穿透API的黑箱,真正理解"图像"在计算机中的表示方式以及各类变换的本质。这种自底向上的学习路径,虽略显笨拙,却最为扎实。对于希望夯实图像处理基础的大家而言,这个项目无疑是不错的参考。</p>
<h2 id="关键词">关键词</h2>
<p>数字图像处理、C#、像素操作、几何变换、灰度变换、噪声抑制、边缘检测、图像分割、WPF、直方图均衡化</p>
<h2 id="最后">最后</h2>
<p>如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。</p>
<p>也可以加入微信公众号 社区,与其他热爱技术的同行一起交流心得,共同成长!</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250527195524293-1794896295.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p><br><br>
来源:https://www.cnblogs.com/1312mn/p/19444713
頁: [1]
查看完整版本: C# 不依赖 OpenCV 的图像处理算法:滤波、锐化与边缘检测