protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { int ImgsW = sourceImage.Width; int ImgsH = sourceImage.Height; int Radius = 2; double _R_ = 0; double _G_ = 0; double _B_ = 0; double Z = 1.0 / Math.Pow(Radius, 4); for (int i = QM.clamp(x - Radius, 0, ImgsW); i < QM.clamp(x + Radius, 0, ImgsW); i++) { double _R = 0; double _G = 0; double _B = 0; for (int j = QM.clamp(y - Radius, 0, ImgsH); j < QM.clamp(y + Radius, 0, ImgsH); j++) { (byte R, byte G, byte B) = sourceImage.GetPixel(i, j); _R += R; _G += G; _B += B; } _R_ += _R * Z; _G_ += _G * Z; _B_ += _B * Z; } return(QM.Col(_R_, _G_, _B_)); }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { int radiusX = kernel.GetLength(0) / 2; int radiusY = kernel.GetLength(1) / 2; double resultR = 0; double resultG = 0; double resultB = 0; for (int l = -radiusY; l <= radiusY; l++) { for (int k = -radiusX; k <= radiusX; k++) { // Значение по X int idX = QM.clamp(x + k, 0, sourceImage.Width - 1); // Значение по Y int idY = QM.clamp(y + l, 0, sourceImage.Height - 1); // Каналы в точки X,Y (byte R, byte G, byte B) = sourceImage.GetPixel(idX, idY); // kernel[0...radiusX, 0...radiusY] // Двумерная свертка resultR += R * kernel[k + radiusX, l + radiusY]; resultG += G * kernel[k + radiusX, l + radiusY]; resultB += B * kernel[k + radiusX, l + radiusY]; } } return(QM.Col(resultR, resultG, resultB)); }
public void AvgColors(QBitmap sourceImage, BackgroundWorker worker) { double _AVG_; double N = sourceImage.Width * sourceImage.Height; _R_ = 0; _B_ = 0; _G_ = 0; for (int i = 0; i < sourceImage.Width; i++) { for (int j = 0; j < sourceImage.Height; j++) { (byte R, byte G, byte B) = sourceImage.GetPixel(i, j); _R_ += R / N; _G_ += G / N; _B_ += B / N; } worker.ReportProgress((int)((float)i / sourceImage.Width * progress)); } _AVG_ = (_R_ + _G_ + _B_) / 3.0; _R_ = _AVG_ / _R_; _G_ = _AVG_ / _G_; _B_ = _AVG_ / _B_; }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { byte k = 15; //Получаем значения трех каналов пикселя с координатами (x,y) (byte R, byte G, byte B) = sourceImage.GetPixel(x, y); return(QM.Col(R + k, G + k, B + k)); }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { (byte oR, byte oG, byte oB) = maskImage.GetPixel(QM.clamp(x, 0, maskImage.Width), QM.clamp(y, 0, maskImage.Height)); (byte pR, byte pG, byte pB) = sourceImage.GetPixel(x, y); byte R = QM.clamp(oR - pR); byte G = QM.clamp(oG - pG); byte B = QM.clamp(oB - pB); return(QM.Col(R, G, B)); }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { //Получаем значения трех каналов пикселя с координатами (x,y) (byte R, byte G, byte B) = sourceImage.GetPixel(x, y); R = QM.clamp(R * _R_); G = QM.clamp(G * _G_); B = QM.clamp(B * _B_); return(QM.Col(R, G, B)); }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { byte k = 15; //Получаем значения трех каналов пикселя с координатами (x,y) (byte R, byte G, byte B) = sourceImage.GetPixel(x, y); double Intensity = (.299F * R + .587F * G + .113F * B); R = QM.clamp(Intensity + k * 2); G = QM.clamp(Intensity + k / 2); B = QM.clamp(Intensity - k * 1); return(QM.Col(R, G, B)); }
public override QBitmap processImage(QBitmap sourceImage, BackgroundWorker worker) { int percentage = 33 * progressPerc / 100; QBitmap SobelXImage = (new SobelXFilter(percentage, 0)).processImage(sourceImage, worker); QBitmap SobelYImage = (new SobelYFilter(percentage, percentage)).processImage(sourceImage, worker); QBitmap resultImage = new QBitmap(sourceImage, false); for (int i = 0; i < sourceImage.Width; i++) { worker.ReportProgress(2 * percentage + (int)((float)i / resultImage.Width * percentage));//сигнализирует элементу BackgroundWorker о текущем процессе if (worker.CancellationPending) { return(null); } for (int j = 0; j < sourceImage.Height; j++) { (byte xR, byte xG, byte xB) = SobelXImage.GetPixel(i, j); (byte yR, byte yG, byte yB) = SobelYImage.GetPixel(i, j); double dch = 0; dch += xR * xR; dch += xG * xG; dch += xB * xB; dch += yR * yR; dch += yG * yG; dch += yB * yB; resultImage.SetPixel(i, j, Math.Sqrt(dch)); } } return(resultImage); }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { int MaskW = Mask.SizeX; int MaskH = Mask.SizeY; byte minR = 255; byte minG = 255; byte minB = 255; int MWHalf = MaskW / 2; int MHHalf = MaskH / 2; for (int j = -MHHalf; j <= MHHalf; j++) { for (int i = -MWHalf; i <= MWHalf; i++) { (byte R, byte G, byte B) = sourceImage.GetPixel(x + i, y + j); if ((Mask.map[i + MWHalf, j + MHHalf]) && (R < minR)) { minR = R; } if ((Mask.map[i + MWHalf, j + MHHalf]) && (G < minG)) { minG = G; } if ((Mask.map[i + MWHalf, j + MHHalf]) && (B < minB)) { minB = B; } } } return(QM.Col(minR, minG, minB)); }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { int MaskW = Mask.SizeX; int MaskH = Mask.SizeY; byte maxR = 0; byte maxG = 0; byte maxB = 0; int MWHalf = MaskW / 2; int MHHalf = MaskH / 2; for (int j = -MHHalf; j <= MHHalf; j++) { for (int i = -MWHalf; i <= MWHalf; i++) { (byte R, byte G, byte B) = sourceImage.GetPixel(x + i, y + j); if ((Mask.map[MWHalf + i, MHHalf + j]) && (R > maxR)) { maxR = R; } if ((Mask.map[MWHalf + i, MHHalf + j]) && (G > maxG)) { maxG = G; } if ((Mask.map[MWHalf + i, MHHalf + j]) && (B > maxB)) { maxB = B; } } } return(QM.Col(maxR, maxG, maxB)); }
protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { (byte R, byte G, byte B) = sourceImage.GetPixel(x, y); //Получаем значения трех каналов пикселя с координатами (x,y) return(QM.Col(.299F * R + .587F * G + .113F * B)); //Вычисляем значение трех каналов для градации серого }
//переопред функцию protected override Color calculateNewPixelColor(QBitmap sourceImage, int x, int y) { (byte R, byte G, byte B) = sourceImage.GetPixel(x, y); //Получаем каналы цвет исходного пикселя return(QM.Col(255 - R, 255 - G, 255 - B)); //Вычисляем инверсию цвета }