Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 17.06.2021
Сообщений: 1
.NET 5

Подскажите, как исправить алгоритм коррекции бочкообразного искажения изображения

17.06.2021, 19:16. Показов 724. Ответов 0

Студворк — интернет-сервис помощи студентам
Доброго дня!

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

Первое, что интересует это правильно ли я скопировал массив, который еще не объявлен:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class data : ICloneable
    {
        public int[] pixels { get; set; }
        public object Clone()
        {
            return new data { pixels = this.pixels };
        }
    }
    class Program
    {
        public static int[] correction2(int[] pixels, int width, int height)
        {
            data pixels1 = new data { pixels = { } };
            data pixelsCopy = (data)pixels1.Clone();
Суть в том, что есть два массива, один из них будет хранить в себе пиксели исходного изображения int[] pixels, а второй - пиксели исправленного pixelsCopy. Можно ли как-то скопировать массив, не объявляя его при помощи метода Array.CopyTo? Если можно, то как это сделать, на примере двух моих массивов?

Второе, что интересует это как вообще работать с изображением, например формата .jpg в консоли? Как его можно обработать через консоль с использованием текущего алгоритма?

Код привожу ниже. Заранее спасибо!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
 
namespace Preview_2
{
    class data : ICloneable
    {
        public int[] pixels { get; set; }
        public object Clone()
        {
            return new data { pixels = this.pixels };
        }
    }
    class Program
    {
        public static int[] correction2(int[] pixels, int width, int height)
        {
            data pixels1 = new data { pixels = { } };
            data pixelsCopy = (data)pixels1.Clone();
 
            //int[] pixelsCopy = pixels.Clone();
 
            // параметры коррекции
            double paramA = -0.007715; // влияет только на крайние пиксели изображения
            double paramB = 0.026731; // в большинстве случаев требуется только b-оптимизация
            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;    // радиус круга
 
                    // центр изображения dst
                    double centerX = (width - 1) / 2.0;
                    double centerY = (height - 1) / 2.0;
 
                    // декартовы координаты точки назначения (относительно центра изображения)
                    double deltaX = (x - centerX) / d;
                    double deltaY = (y - centerY) / d;
 
                    // расстояние или радиус изображения dst
                    double dstR = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);
 
                    // расстояние или радиус изображения src (с формулой)
                    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.pixels[srcY * width + srcX];
                    }
                }
            }
 
            return pixels;
        }
        static void Main(string[] args)
        {
            
        }
    }
}
Добавлено через 5 часов 1 минуту
Попробовал реализовать задуманное при помощи Bitmap.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Bitmap image1;
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            try
            {
                // Retrieve the image.
                image1 = new Bitmap(@"C:\Users\Nikolaev\Desktop\dstView1.jpg", true);
                var array = new int[image1.Width, image1.Height];
                /*
                int[] pixels = { 0 };
                int[] pixelsCopy = { 0 };
                Array.Copy(pixels, 2, pixelsCopy, 0, pixels.Length);
                */
 
                double paramA = -0.007715; // влияет только на крайние пиксели изображения
                double paramB = 0.026731; // в большинстве случаев требуется только b-оптимизация
                double paramC = 0.0; // наиболее равномерная коррекция
                double paramD = 1.0 - paramA - paramB - paramC; // описывает линейное масштабирование изображения
 
 
                // Loop through the images pixels to reset color.
 
                for (int x = 0; x < image1.Width; x++)
                {
                    for (int y = 0; y < image1.Height; y++)
                    {
 
                        var pixel = image1.GetPixel(x, y);
                        array[x, y] = Convert.ToInt16(pixel.R == 0 && pixel.G == 0 && pixel.B == 0);
 
                        int d = Math.Min(image1.Width, image1.Height) / 2;    // радиус круга
 
                        // центр изображения dst
                        double centerX = (image1.Width - 1) / 2.0;
                        double centerY = (image1.Height - 1) / 2.0;
 
                        // декартовы координаты точки назначения (относительно центра изображения)
                        double deltaX = (x - centerX) / d;
                        double deltaY = (y - centerY) / d;
 
                        // расстояние или радиус изображения dst
                        double dstR = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);
 
                        // расстояние или радиус изображения src (с формулой)
                        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 < image1.Width && srcY < image1.Height)
                        {
                            int dstPos = y * image1.Width + x;
 
                            array[dstPos, 0] = { 0 };
                            for (int x1 = 0; x1 < array.Length; x1++)
                                for (int x2 = 0; x2 < array.Length; x1++)
                                {
                                    array[srcY * image1.Width + srcX];
                                }
                        }
 
                        /*
                        Color pixelColor = image1.GetPixel(x, y);
                        Color newColor = Color.FromArgb(pixelColor.R, 0, 0);
                        image1.SetPixel(x, y, newColor);
 
                        BitmapSource bitmap = BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, rawStride);
                        */
 
                    }
                }
 
                // Set the PictureBox to display the image.
                pictureBox1.Image = image1;
 
                // Display the pixel format in Label1.
                label1.Text = "Pixel format: " + image1.PixelFormat.ToString();
            }
            catch (ArgumentException)
            {
                MessageBox.Show("There was an error." +
                    "Check the path to the image file.");
            }
        }
Вопрос в том, как теперь вывести это изображение в PictureBox и как реализовать последний условный опреатор
C#
1
2
3
4
5
6
7
8
9
10
11
if (srcX >= 0 && srcY >= 0 && srcX < image1.Width && srcY < image1.Height)
                        {
                            int dstPos = y * image1.Width + x;
 
                            array[dstPos, 0] = { 0 };
                            for (int x1 = 0; x1 < array.Length; x1++)
                                for (int x2 = 0; x2 < array.Length; x1++)
                                {
                                    array[srcY * image1.Width + srcX];
                                }
                        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.06.2021, 19:16
Ответы с готовыми решениями:

Искажения изображения на компьютере
изображение постоянно искажается, особенно это заметно на тексте, меняется величина надписей и качество шрифтов на фотографиях пример на...

Алгоритм коррекции ошибок в QR содах
Пишу лабораторную работу для универа по генерации QR кодов, но никак не могу разобраться с алгоритмом коррекции ошибок. Нашел кучу...

Искажения изображения после обновления до Win 8.1
Добрый вечер!:) Прошу у вас помощи, так как своими силами устранить проблему не удалось:( В общем, картина такая: имеется ноутбук Dell...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2021, 19:16
Помогаю со студенческими работами здесь

Пробивает ток на корпусе пк, искажения изображения на мониторе
Здравствуйте! Появились помехи на мониторе, дрожания, дефекты. Все возможное перепроверено: шнур, замена 2х вздутых кондеров на мониторе,...

Горизонтальные искажения при прокрутке изображения на мониторе
Добрый день, заметил такую вещь, при любой прокрутке изображения появляются горизонтальные полосы во всю длину монитора, изображение как бы...

9600GT - искажения изображения через несколько часов работы
Проблема такая,купил сегодня видеокарту Asus 9600GT,у меня блок питания FSP 350W - Зная доволно слабенько,но установил ее проработал 3...

Искажения фрагмента изображения при копировании или записи
Добрый день, Знатоки! Помогите пожалуйста с проблемой! Пытаюсь вырезать заданный фрагмент из хорошего файла изображения и записать в...

Гамма-коррекции полутонового изображения таким образом, чтобы среднее значение яркости в новом изображении увеличилось н
Гамма-коррекции полутонового изображения таким образом, чтобы среднее значение яркости в новом изображении увеличилось на 10%. если у кого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru