C#實現(xiàn)圖片邊緣銳化的完整代碼
在 C# 中進行圖像的邊緣銳化,可以通過卷積濾波器實現(xiàn)。邊緣銳化的基本思想是通過卷積核(也稱為濾波器或掩模)來增強圖像中的邊緣。我們可以使用一個簡單的銳化核,例如:
[ 0, -1, 0][-1, 5, -1][ 0, -1, 0]
這個卷積核可以用于增強圖像中的邊緣。下面是如何在 C# 中實現(xiàn)這一操作的完整代碼,包括加載圖像、應用銳化濾波器和保存結果圖像。
1. 安裝 System.Drawing.Common
確保你已經(jīng)安裝了 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# 中實現(xiàn)圖像的邊緣銳化。這個實現(xiàn)使用了卷積濾波器來增強圖像的邊緣,從而使圖像更加清晰。
到此這篇關于C#實現(xiàn)圖片邊緣銳化的完整代碼的文章就介紹到這了,更多相關C#圖片邊緣銳化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#實現(xiàn)將DataTable內容輸出到Excel表格的方法
這篇文章主要介紹了C#實現(xiàn)將DataTable內容輸出到Excel表格的方法,較為詳細的分析了C#基于DataTable保存Excel數(shù)據(jù)的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
C#實現(xiàn)String字符串轉化為SQL語句中的In后接的參數(shù)詳解
在本篇文章中小編給大家分享的是一篇關于C#實現(xiàn)String字符串轉化為SQL語句中的In后接的實例內容和代碼,需要的朋友們參考下。2020-01-01

