0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 4
1

Обработка изображений

10.07.2012, 19:15. Показов 8043. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Пробую разобраться с частотной обработкой изображений. В инете нашел простое решение.
Основной алгоритм обработки выглядит вот так:
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
        //Получаем количество байт в загруженном изображении
        public static byte[] getBytes(Bitmap input_image)
        {
            int in_bytes = input_image.Width * input_image.Height * 3;
            Rectangle rect = new Rectangle
                (
                    0,
                    0,
                    input_image.Width,
                    input_image.Height
                );
 
            BitmapData input_image_Data = input_image.LockBits
                (
                    rect,
                    ImageLockMode.ReadOnly,
                    PixelFormat.Format24bppRgb
                );
 
            
            byte[] out_bytes = new byte[in_bytes];
 
            System.Runtime.InteropServices.Marshal.Copy
                (
                    input_image_Data.Scan0,
                    out_bytes,
                    0,
                    in_bytes
                );
            input_image.UnlockBits(input_image_Data);
 
            return out_bytes;//На выходе - массив байт
        }
 
        //Формируем изображение из массива пикселей
        public static Bitmap makeBitmap(byte[] input, int width, int height)
        {
            if (input.Length % 3 != 0) return null;
 
            Bitmap output = new Bitmap(width, height);
            BitmapData image_output_Data = output.LockBits
                (
                    new Rectangle(0, 0, width, height),
                    ImageLockMode.ReadWrite,
                    PixelFormat.Format24bppRgb 
                );
 
            System.Runtime.InteropServices.Marshal.Copy
                (
                    input,
                    0,
                    image_output_Data.Scan0,
                    input.Length
                );
            output.UnlockBits(image_output_Data);
 
            return output;
        }
 
        //Алгоритм попиксельного преобразования изображения
        public static Bitmap useFilter(Bitmap input_image, double[,] convolution_kernel)
        {
            byte[] inputBytes = Process.getBytes(input_image);
            byte[] outputBytes = new byte[inputBytes.Length];
 
            int width = input_image.Width;
            int height = input_image.Height;
 
            int kernelWidth = convolution_kernel.GetLength(0);
            int kernelHeight = convolution_kernel.GetLength(1);
            
 
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)//Взяли пиксель изображения {x,y}
                {
                    
                    double rSum = 0, gSum = 0, bSum = 0, kSum = 0;//Создали переменные сумм каждого цвета и ядра
 
                    for (int i = 0; i < kernelWidth; i++)
                    {
                        for (int j = 0; j < kernelHeight; j++)//Взяли элемент ядра
                        {
                            int pixelPosX = x + (i - (kernelWidth / 2));
                            int pixelPosY = y + (j - (kernelHeight / 2));
                            if ((pixelPosX < 0) ||
                                (pixelPosX >= width) ||
                                (pixelPosY < 0) ||
                                (pixelPosY >= height)) continue;
 
                            byte r = inputBytes[3 * (width * pixelPosY + pixelPosX) + 0];
                            byte g = inputBytes[3 * (width * pixelPosY + pixelPosX) + 1];
                            byte b = inputBytes[3 * (width * pixelPosY + pixelPosX) + 2];
 
                            double kernelVal = convolution_kernel[i, j];
 
                            rSum += r * kernelVal;
                            gSum += g * kernelVal;
                            bSum += b * kernelVal;
 
                            kSum += kernelVal;
                        }
                    }
 
                    if (kSum <= 0) kSum = 1;
 
                    rSum /= kSum;
                    if (rSum < 0) rSum = 0;
                    if (rSum > 255) rSum = 255;
 
                    gSum /= kSum;
                    if (gSum < 0) gSum = 0;
                    if (gSum > 255) gSum = 255;
 
                    bSum /= kSum;
                    if (bSum < 0) bSum = 0;
                    if (bSum > 255) bSum = 255;
 
                    outputBytes[3 * (width * y + x) + 0] = (byte)rSum;
                    outputBytes[3 * (width * y + x) + 1] = (byte)gSum;
                    outputBytes[3 * (width * y + x) + 2] = (byte)bSum;
                }
            }
            if (BDSIP.Predefined.fileIsChanged == false) BDSIP.Predefined.fileIsChanged = true;
            return Process.makeBitmap(outputBytes, width, height);
        }
    }
Не вдаваясь в подробности, оптимизацию и т.д. первым делом хочу понять в чем причина такого факта: есть несколько ядер свертки, среди них, например, размытие и резкость. Если резкость на всех опробованных изображениях работала корректно и одинаково, то если применить размытие для изображений c шириной ровно 1366 точек, то изображение станет полутоновым.
Вопрос кажется явно странным, но подскажите, в какую сторону копать - в чём может быть причина «обесцвечивания»?
На изображения с такой шириной наткнулся в папке обоев, но это ведь не может быть из-за разрешения моего монитора?
ядро размытия:
[1 1 1]
[1 1 1]
[1 1 1]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2012, 19:15
Ответы с готовыми решениями:

обработка изображений в C#
обработка изображений... у меня есть вот такая программа (файл вложен), там считает размерность...

Многопоточная обработка изображений
Приложение должно обеспечивать запуск до 10 потоков, обрабатывающих до 10 различных изображений...

Обработка изображений. Лапласиан
Цифровая обработка изображений. Помогите найти ошибку. Сама программа работает без ошибок в...

Обработка изображений - Тепловизионная экспертиза зданий
Доброго времени суток! Помогите, пожалуйста - подскажите литературу или примеры программ. Я пишу...

3
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
10.07.2012, 20:59 2
Цитата Сообщение от simplicate Посмотреть сообщение
в чём может быть причина «обесцвечивания»?
в том, что rSum, gSum и bSum на выходе имеют одинаковое значение
0
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 4
10.07.2012, 21:02  [ТС] 3
Цитата Сообщение от nio Посмотреть сообщение
в том, что rSum, gSum и bSum на выходе имеют одинаковое значение
Это я понимаю, но как это можно связать с шириной именно 1366?
http://habrahabr.ru/post/62738/ Вот, откуда я все это брал

Нет, я не прав, 1366 не при чем, есть и другие размеры, которые на выходе обесцвеченные. просто если в изображении шириной 1366 изменить его размер на1 пиксель куда в плюс или минус, то такого эффекта уже не будет. Ничего не понимаю
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
11.07.2012, 09:46 4
просчитай свои вычисления (вручную, на листке) и посмотри, почему у тебя значения уравниваются
0
11.07.2012, 09:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2012, 09:46
Помогаю со студенческими работами здесь

Обработка изображений алгоритмом нерезкого маскирования
Всем привет! Помогите плиз!:cry: Нужно написать прогу что бы она обрабатывала изображение...

Обработка изображений
Подскажите пожалуйста, какими средствами можно реализовать задачу: есть картинка карты Украины, как...

Обработка изображений, память
Здравствуйте, многопоточно (System.Threading.Tasks.Parallel.For) обрабатываю 134 изображения, на...

Обработка изображений (распознавание текста)
Здравствуйте. Задача следующая: имеется сканированный документ с рукописным текстом. Каким образом...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru