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);
        }
示例#2
0
 private Bitmap ThresholdingHandler(Bitmap srcImage, Bitmap desImage, GetInMatrixHandler getInMatrixHandler)
 {
     desImage = FilteringReplicate(srcImage, desImage, 3, getInMatrixHandler);
     Thresholding(desImage);
     return(desImage);
 }