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(); }
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(); }
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(); }
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(); }