protected Bitmap FilteringReplicate(Bitmap srcImage, Bitmap desImage, int level, GetInMatrixHandler getInMatrixHandler) { int temp = level / 2; // Tô viền desImage = ReplicateBorder(desImage, temp); BitmapData srcBitmapData = srcImage.LockBits(new Rectangle(0, 0, srcImage.Width, srcImage.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); BitmapData desBitmapData = desImage.LockBits(new Rectangle(0, 0, desImage.Width, desImage.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); int padding = srcBitmapData.Stride - srcBitmapData.Width * 3; byte *pSrc = (byte *)srcBitmapData.Scan0; byte *pDes = (byte *)desBitmapData.Scan0; // Di chuyển con trỏ tới (1, 1) pSrc = pSrc + (srcBitmapData.Stride + 3) * temp; pDes = pDes + (desBitmapData.Stride + 3) * temp; for (int i = temp; i < srcBitmapData.Height - temp; i++) { for (int j = temp; j < srcBitmapData.Width - temp; j++) { int[,] matrix = GetMatrixAroundPixel(srcBitmapData, j, i, 3); int newValue = getInMatrixHandler(matrix); if (newValue > 255) { newValue = 255; } if (newValue < 0) { newValue = 0; } pDes[0] = (byte)newValue; pDes[1] = (byte)newValue; pDes[2] = (byte)newValue; pDes += 3; pSrc += 3; } pDes += 3 * (level - 1); pDes += padding; pSrc += 3 * (level - 1); pSrc += padding; } srcImage.UnlockBits(srcBitmapData); desImage.UnlockBits(desBitmapData); return(desImage); }
private Bitmap ThresholdingHandler(Bitmap srcImage, Bitmap desImage, GetInMatrixHandler getInMatrixHandler) { desImage = FilteringReplicate(srcImage, desImage, 3, getInMatrixHandler); Thresholding(desImage); return(desImage); }