Коррекция изображения на с#

Подскажите, каким образом можно взаимодействовать с пикселями изображения Bitmap?

Суть задачи в коррекции бочкообразных искажений. Есть алгоритм, который меняет положение пикселей изображения вдоль горизонтальной оси:

public static int[] correction(int[] pixels, int width, int height)
        {
            //int[] pixels = new int[width * height];
            int[] pixelsCopy = (int[])pixels.Clone();


            double paramA = -0.007715; // влияет только на крайние пиксели изображения
            double paramB = 0.026731; // наиболее сильно влияющий на конечный результат параметр
            double paramC = 0.0; // наиболее равномерная коррекция
            double paramD = 1.0 - paramA - paramB - paramC; // описывает линейное масштабирование изображени

            // Алгоритм исправления

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {

                    int d = Math.Min(width, height) / 2; // радиус круга, вписанного в изображения

                    // центр изображения
                    double centerX = (width - 1) / 2.0;
                    double centerY = (height - 1) / 2.0;

                    // декартовы координаты точки назначения, относительно центра изображения
                    double deltaX = (x - centerX) / d;
                    double deltaY = (y - centerY) / d;

                    // расстояние или радиус изображения
                    double dstR = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);

                    // радиус изображения с использованием полинома
                    double srcR = (paramA * dstR * dstR * dstR + paramB * dstR * dstR + paramC * dstR + paramD) * dstR;

                    // сравнение старого и нового расстояния, чтобы получить коэффициент
                    double factor = Math.Abs(dstR / srcR);

                    // координаты в исходном изображении
                    double srcXd = centerX + (deltaX * factor * d);
                    double srcYd = centerY + (deltaY * factor * d);

                    // ближайшая точка, без интерполяции
                    int srcX = (int)srcXd;
                    int srcY = (int)srcYd;

                    if (srcX >= 0 && srcY >= 0 && srcX < width && srcY < height)
                    {
                        int dstPos = y * width + x;
                        pixels[dstPos] = pixelsCopy[srcY * width + srcX];
                    }
                }
            }
            return pixels;
        }

Я загрузил новое изображение при помощи Bitmap, создал пустое изображение и записал в него цвета основного:

Bitmap sourceImage1 = (Bitmap)Image.FromFile(@"C:\Users\user\Desktop\dstView2.jpg");
                Bitmap targetImage1 = new Bitmap(sourceImage1.Width, sourceImage1.Height, sourceImage1.PixelFormat);

                for (int x = 0; x < targetImage1.Width; x++)
                {
                    for (int y = 0; y < targetImage1.Height; y++)
                    {
                        Color imageColor = sourceImage1.GetPixel(x, y); 
                        Color newColor = Color.FromArgb(imageColor.A, imageColor.R, imageColor.G, imageColor.B); //хранит цвет изображения
                        targetImage1.SetPixel(x, y, newColor);
                    }
                }

Что нужно делать дальше? Новое изображение хранит цвета пикселей исходного, но как менять сами координаты пикселей непонятно.

Заранее спасибо!


Ответы (0 шт):