■ Bitmap 클래스를 사용해 중앙값 필터(Median Filter)를 만드는 방법을 보여준다.
▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; #region 중앙값 필터 적용하기 - ApplyMedianFilter(sourceBitmap, matrixSize) /// <summary> /// 중앙값 필터 적용하기 /// </summary> /// <param name="sourceBitmap">소스 비트맵</param> /// <param name="matrixSize">매트릭스 크기</param> /// <returns>비트맵</returns> public static Bitmap ApplyMedianFilter(Bitmap sourceBitmap, int matrixSize) { BitmapData sourceBitmapData = sourceBitmap.LockBits ( new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb ); byte[] sourceByteArray = new byte[sourceBitmapData.Stride * sourceBitmapData.Height]; byte[] targetByteArray = new byte[sourceBitmapData.Stride * sourceBitmapData.Height]; Marshal.Copy(sourceBitmapData.Scan0, sourceByteArray, 0, sourceByteArray.Length); sourceBitmap.UnlockBits(sourceBitmapData); int filterOffset = (matrixSize - 1) / 2; int temporaryOffset = 0; int byteOffset = 0; List<int> neighbourPixelList = new List<int>(); byte[] middlePixel; for(int offsetY = filterOffset; offsetY < sourceBitmap.Height - filterOffset; offsetY++) { for(int offsetX = filterOffset; offsetX < sourceBitmap.Width - filterOffset; offsetX++) { byteOffset = offsetY * sourceBitmapData.Stride + offsetX * 4; neighbourPixelList.Clear(); for(int filterY = -filterOffset; filterY <= filterOffset; filterY++) { for(int filterX = -filterOffset; filterX <= filterOffset; filterX++) { temporaryOffset = byteOffset + (filterX * 4) + (filterY * sourceBitmapData.Stride); neighbourPixelList.Add(BitConverter.ToInt32(sourceByteArray, temporaryOffset)); } } neighbourPixelList.Sort(); middlePixel = BitConverter.GetBytes(neighbourPixelList[filterOffset]); targetByteArray[byteOffset ] = middlePixel[0]; targetByteArray[byteOffset + 1] = middlePixel[1]; targetByteArray[byteOffset + 2] = middlePixel[2]; targetByteArray[byteOffset + 3] = middlePixel[3]; } } Bitmap targetBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height); BitmapData targetBitmapData = targetBitmap.LockBits ( new Rectangle(0, 0, targetBitmap.Width, targetBitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb ); Marshal.Copy(targetByteArray, 0, targetBitmapData.Scan0, targetByteArray.Length); targetBitmap.UnlockBits(targetBitmapData); return targetBitmap; } #endregion |