//<sumary> // x, y : point (x,y) // size : convolution size //</sumary> private Color GetAvg(LockBitmap lbm, int x, int y, int size = 3) { if (size % 2 == 0) { throw new ArgumentException("Convolution size must is odd number"); } int sumR = 0, sumG = 0, sumB = 0, sumA = 0; for (int i = x - size / 2; i <= x + size / 2; i++) { for (int j = y - size / 2; j <= y + size / 2; j++) { if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height) { sumA += (int)lbm.GetPixel(i, j).A; sumR += (int)lbm.GetPixel(i, j).R; sumG += (int)lbm.GetPixel(i, j).G; sumB += (int)lbm.GetPixel(i, j).B; } } } sumA = (int)(Math.Round((double)sumA / (size * size), MidpointRounding.AwayFromZero)); sumR = (int)(Math.Round((double)sumR / (size * size), MidpointRounding.AwayFromZero)); sumG = (int)(Math.Round((double)sumG / (size * size), MidpointRounding.AwayFromZero)); sumB = (int)(Math.Round((double)sumB / (size * size), MidpointRounding.AwayFromZero)); return(lbm.Depth == 32 ? Color.FromArgb(sumA, sumR, sumG, sumB) : Color.FromArgb(sumR, sumG, sumB)); }
private Color GetMax(LockBitmap lbm, int x, int y, int size = 3) { Color color = new Color(); int maxVal = 0, tmp; if (size % 2 == 0) { throw new ArgumentException("Convolution size must is odd number"); } for (int i = x - size / 2; i <= x + size / 2; i++) { for (int j = y - size / 2; j <= y + size / 2; j++) { if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height) { tmp = lbm.GetPixel(i, j).R + lbm.GetPixel(i, j).G + lbm.GetPixel(i, j).B + lbm.GetPixel(i, j).A; if (tmp > maxVal) { maxVal = tmp; color = lbm.GetPixel(i, j); } } else { } } } return(color); }
private Color GetSharp(LockBitmap lbm, int x, int y, int size = 3) { if (size % 2 == 0) { throw new ArgumentException("Convolution size must is odd number"); } // index of CONV_SHARP matrix int index = 0; int R = 0, G = 0, B = 0, A = 0; for (int i = x - size / 2; i <= x + size / 2; i++) { for (int j = y - size / 2; j <= y + size / 2; j++) { if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height) { if (size == 3) { A += (int)lbm.GetPixel(i, j).A *CONV_SHARP_3_3[index]; R += (int)lbm.GetPixel(i, j).R *CONV_SHARP_3_3[index]; G += (int)lbm.GetPixel(i, j).G *CONV_SHARP_3_3[index]; B += (int)lbm.GetPixel(i, j).B *CONV_SHARP_3_3[index]; } else if (size == 5) { A += (int)lbm.GetPixel(i, j).A *CONV_SHARP_5_5[index]; R += (int)lbm.GetPixel(i, j).R *CONV_SHARP_5_5[index]; G += (int)lbm.GetPixel(i, j).G *CONV_SHARP_5_5[index]; B += (int)lbm.GetPixel(i, j).B *CONV_SHARP_5_5[index]; } else { throw new System.ArgumentException("size cannot be" + size, "original"); } } index++; } } A = (A < 0 ? 0 : (A > 255 ? 255 : A)); R = (R < 0 ? 0 : (R > 255 ? 255 : R)); G = (G < 0 ? 0 : (G > 255 ? 255 : G)); B = (B < 0 ? 0 : (B > 255 ? 255 : B)); return(lbm.Depth == 32 ? Color.FromArgb(A, R, G, B) : Color.FromArgb(R, G, B)); }
private Color GetMedian(LockBitmap lbm, int x, int y, int size = 3) { List <byte> rColor = new List <byte>(); List <byte> gColor = new List <byte>(); List <byte> bColor = new List <byte>(); List <byte> aColor = new List <byte>(); if (size % 2 == 0) { throw new ArgumentException("Convolution size must is odd number"); } for (int i = x - size / 2; i <= x + size / 2; i++) { for (int j = y - size / 2; j <= y + size / 2; j++) { if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height) { rColor.Add(lbm.GetPixel(i, j).R); gColor.Add(lbm.GetPixel(i, j).G); bColor.Add(lbm.GetPixel(i, j).B); aColor.Add(lbm.GetPixel(i, j).A); } else { rColor.Add(0); gColor.Add(0); bColor.Add(0); aColor.Add(0); } } } int mid = (size * size - 1) / 2; rColor.Sort(); gColor.Sort(); bColor.Sort(); aColor.Sort(); return(lbm.Depth == 32 ? Color.FromArgb(aColor[mid], rColor[mid], gColor[mid], bColor[mid]) : Color.FromArgb(rColor[mid], gColor[mid], bColor[mid])); }
private Bitmap GetResult(Bitmap bmp, int type) { imageOutput = new Bitmap(imageInput.Width, imageInput.Height, imageInput.PixelFormat); LockBitmap lockBitmapIn = new LockBitmap(imageInput); lockBitmapIn.LockBits(); LockBitmap lockBitmapOut = new LockBitmap(imageOutput); lockBitmapOut.LockBits(); int width = lockBitmapIn.Width; int height = lockBitmapIn.Height; switch (type) { case 1: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetAvg(lockBitmapIn, i, j, CONV_SIZE_3_3)); } } break; case 2: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetAvg(lockBitmapIn, i, j, CONV_SIZE_5_5)); } } break; case 3: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetMedian(lockBitmapIn, i, j, CONV_SIZE_3_3)); } } break; case 4: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetMedian(lockBitmapIn, i, j, CONV_SIZE_5_5)); } } break; case 5: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetSharp(lockBitmapIn, i, j, CONV_SIZE_3_3)); } } break; case 6: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetSharp(lockBitmapIn, i, j, CONV_SIZE_5_5)); } } break; case 7: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetMax(lockBitmapIn, i, j, CONV_SIZE_3_3)); } } break; case 8: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetMax(lockBitmapIn, i, j, CONV_SIZE_5_5)); } } break; case 9: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetMin(lockBitmapIn, i, j, CONV_SIZE_3_3)); } } break; case 10: for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { lockBitmapOut.SetPixel(i, j, GetMin(lockBitmapIn, i, j, CONV_SIZE_5_5)); } } break; default: MessageBox.Show("Hãy chọn một bộ lọc!, pls", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); lockBitmapIn.UnlockBits(); lockBitmapOut.UnlockBits(); return(null); } lockBitmapIn.UnlockBits(); lockBitmapOut.UnlockBits(); return(imageOutput); }