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)文章
C#實現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法
這篇文章主要介紹了C#實現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法,較為詳細的分析了C#基于DataTable保存Excel數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08C#實現(xiàn)String字符串轉(zhuǎn)化為SQL語句中的In后接的參數(shù)詳解
在本篇文章中小編給大家分享的是一篇關(guān)于C#實現(xiàn)String字符串轉(zhuǎn)化為SQL語句中的In后接的實例內(nèi)容和代碼,需要的朋友們參考下。2020-01-01圖解如何使用C#創(chuàng)建Windows服務(wù)
本文主要介紹了圖解如何使用C#創(chuàng)建Windows服務(wù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07