C#實現(xiàn)圖片邊緣銳化的完整代碼
在 C# 中進行圖像的邊緣銳化,可以通過卷積濾波器實現(xiàn)。邊緣銳化的基本思想是通過卷積核(也稱為濾波器或掩模)來增強圖像中的邊緣。我們可以使用一個簡單的銳化核,例如:
[ 0, -1, 0][-1, 5, -1][ 0, -1, 0]
這個卷積核可以用于增強圖像中的邊緣。下面是如何在 C# 中實現(xiàn)這一操作的完整代碼,包括加載圖像、應(yīng)用銳化濾波器和保存結(jié)果圖像。
1. 安裝 System.Drawing.Common
確保你已經(jīng)安裝了 System.Drawing.Common 庫。你可以通過NuGet包管理器安裝它,或者使用以下命令:
dotnet add package System.Drawing.Common
2. 編寫卷積濾波器應(yīng)用方法
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. 使用卷積濾波器進行邊緣銳化
編寫一個主程序來加載圖像、應(yīng)用銳化濾波器并保存結(jié)果圖像。
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 }
};
// 應(yīng)用銳化濾波器
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 是正確的。
- 調(diào)整卷積核可以改變銳化效果。上面使用的是一個常見的銳化卷積核。
- System.Drawing 命名空間需要 System.Drawing.Common 包,在 .NET Core 或 .NET 5/6 中需要特別注意包的引用。
通過這些步驟,你可以在 C# 中實現(xiàn)圖像的邊緣銳化。這個實現(xiàn)使用了卷積濾波器來增強圖像的邊緣,從而使圖像更加清晰。
到此這篇關(guān)于C#實現(xiàn)圖片邊緣銳化的完整代碼的文章就介紹到這了,更多相關(guān)C#圖片邊緣銳化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity shader實現(xiàn)移動端模擬深度水效果
這篇文章主要為大家詳細介紹了Unity shader實現(xiàn)移動端模擬深度水效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05
C# DataSet的內(nèi)容寫成XML時如何格式化字段數(shù)據(jù)
許多讀者經(jīng)常詢問一個問題,那就是在將DataSet的內(nèi)容寫成XML時,如何格式化字段數(shù)據(jù)。最常見的需求,就是希望日期時間值與數(shù)值數(shù)據(jù)能夠以所需的格式呈現(xiàn)于XML中。2009-02-02
C#實現(xiàn)從Word文檔和各種Word元素中自動提取文本
手動提取文本既費時又容易出錯,尤其是在處理較長或復(fù)雜的Word文檔時,這篇文章將探討如何使用C# 從Word文檔中提取文本,我們將涵蓋不同方面的內(nèi)容,希望對大家有所幫助2025-11-11
在C#中使用二叉樹實時計算海量用戶積分排名的實現(xiàn)詳解
這篇文章主要介紹了在C#中使用二叉樹實時計算海量用戶積分排名的實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

