コード例 #1
0
        public System.Drawing.Bitmap ApplyFilter(System.Drawing.Bitmap srcImage, int filterSubType, int level)
        {
            YUVModel yuvModel = new YUVModel(srcImage);
            int min = (int)yuvModel.Ymin;
            int max = (int)yuvModel.Ymax;

            int alpha1 = 0; // Сумма высот всех бинов для класса 1, домноженных на положение их середины
            int beta1 = 0; // Сумма высот всех бинов для класса 1

            float maxSigma = -1; // Максимальное значение межклассовой дисперсии
            int threshold = 0; // Порог, соответствующий maxSigma

            int m = 0; // m - сумма высот всех бинов, домноженных на положение их середины
            int n = 0; // n - сумма высот всех бинов
            for (int t = 0; t <= max - min; t++)
            {
                m += t * (int)yuvModel.histY[t];
                n += (int)yuvModel.histY[t];
            }

            // t пробегается по всем возможным значениям порога
            for (int t = 0; t < 256; t++)
            {
                alpha1 += t * (int)yuvModel.histY[t];
                beta1 += (int)yuvModel.histY[t];

                // Вероятность класса 1.
                float w1 = (float)beta1 / n;

                // a = a1 - a2, где a1, a2 - средние арифметические для классов 1 и 2
                float a = (float)alpha1 / beta1 - (float)(m - alpha1) / (n - beta1);

                float sigma = w1 * (1 - w1) * a * a;

                // Если sigma больше текущей максимальной, то обновляем maxSigma и порог
                if (sigma > maxSigma)
                {
                    maxSigma = sigma;
                    threshold = t;
                }
            }

            for (int i = 0; i < yuvModel.width * yuvModel.height; i++)
            {
                if ((int)yuvModel.Y[i] > threshold)
                {
                    yuvModel.Y[i] = 255;
                    yuvModel.U[i] = 128;
                    yuvModel.V[i] = 128;
                }
                else
                {
                    yuvModel.Y[i] = 0;
                    yuvModel.U[i] = 128;
                    yuvModel.V[i] = 128;
                }
            }

            return yuvModel.GetRGBFromYUV();
        }
コード例 #2
0
 public Bitmap ApplyFilter(Bitmap srcImage, int filterSubType, int level)
 {
     YUVModel yuvModel = new YUVModel(srcImage);
     for (int i = 0; i < yuvModel.width * yuvModel.height; i++)
     {
         yuvModel.Y[i] = (yuvModel.Y[i] - yuvModel.Ymin) * 255 / (yuvModel.Ymax - yuvModel.Ymin);
     }
     return yuvModel.GetRGBFromYUV();
 }
コード例 #3
0
 public Bitmap ApplyFilter(Bitmap srcImage, int filterSubType, int level)
 {
     double value = (double)level / 4;
     YUVModel yuvModel = new YUVModel(srcImage);
     for (int i = 0; i < yuvModel.width * yuvModel.height; i++)
     {
         yuvModel.Y[i] = Math.Pow(yuvModel.Y[i] / 255, value) * 255;
     }
     return yuvModel.GetRGBFromYUV();
 }
コード例 #4
0
 public Bitmap ApplyFilter(Bitmap srcImage, int filterSubType, int level)
 {
     YUVModel yuvModel = new YUVModel(srcImage);
     for (int i = 1; i < 256; i++)
     {
         yuvModel.histY[i] += yuvModel.histY[i - 1];
     }
     for (int i = 0; i < 256; i++)
     {
         yuvModel.histY[i] = 255 * yuvModel.histY[i] / yuvModel.width / yuvModel.height;
     }
     for (int i = 0; i < yuvModel.width * yuvModel.height; i++)
     {
         yuvModel.Y[i] = yuvModel.histY[Convert.ToByte(yuvModel.Y[i])];
     }
     return yuvModel.GetRGBFromYUV();
 }