当前位置: 代码网 > it编程>编程语言>C# > C#实现图片边缘锐化的完整代码

C#实现图片边缘锐化的完整代码

2024年07月03日 C# 我要评论
在 c# 中进行图像的边缘锐化,可以通过卷积滤波器实现。边缘锐化的基本思想是通过卷积核(也称为滤波器或掩模)来增强图像中的边缘。我们可以使用一个简单的锐化核,例如:[ 0, -1, 0][-1,

在 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#图片边缘锐化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com