public static Bitmap ApplyMedianPassFilter(Bitmap sourceBitmap, eMedianFilterQuality quality) { BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); byte[] pixelBuffer = new byte[sourceData.Stride * sourceData.Height]; byte[] resultBuffer = new byte[sourceData.Stride * sourceData.Height]; Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length); sourceBitmap.UnlockBits(sourceData); var qualityValue = (int)(quality); var neighborsOffset = qualityValue / 2; var mediumValueIndex = (qualityValue * qualityValue + 1) / 2; for (int imageOffsetX = neighborsOffset; imageOffsetX < sourceBitmap.Height - neighborsOffset; imageOffsetX++) { for (int imageOffsetY = neighborsOffset; imageOffsetY < sourceBitmap.Width - neighborsOffset; imageOffsetY++) { var centralPixelPos = (sourceData.Stride * imageOffsetX) + (imageOffsetY * BYTES_PER_PIXEL); var blueValues = new byte[qualityValue * qualityValue]; var greenValues = new byte[qualityValue * qualityValue]; var redValues = new byte[qualityValue * qualityValue]; var posOnArray = 0; for (int offsetX = -neighborsOffset; offsetX <= neighborsOffset; offsetX++) { for (int offsetY = -neighborsOffset; offsetY <= neighborsOffset; offsetY++) { var currentPixelPos = (sourceData.Stride * (imageOffsetX + offsetX)) + (offsetY + imageOffsetY) * BYTES_PER_PIXEL; blueValues[posOnArray] = pixelBuffer[currentPixelPos]; greenValues[posOnArray] = pixelBuffer[currentPixelPos + 1]; redValues[posOnArray] = pixelBuffer[currentPixelPos + 2]; posOnArray++; } } resultBuffer[centralPixelPos] = blueValues.OrderBy(v => v).ElementAt(mediumValueIndex); resultBuffer[centralPixelPos + 1] = greenValues.OrderBy(v => v).ElementAt(mediumValueIndex); resultBuffer[centralPixelPos + 2] = redValues.OrderBy(v => v).ElementAt(mediumValueIndex); resultBuffer[centralPixelPos + 3] = 255; } } return(BitmapHelper.CreateNewBitmapFrom(sourceBitmap, resultBuffer)); }
private void ApplyMedianFilter(eMedianFilterQuality quality) { var result = ImageManipulator.ApplyMedianPassFilter(_originalImage, quality); Image = BitmapHelper.BitmapToBitmapImage(result); }