Форум программистов, компьютерный форум CyberForum.ru

фильтр Гаусса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Программирование ARM http://www.cyberforum.ru/cpp-beginners/thread581906.html
Привет. Хочется научиться программировать ARMы. Подскажите с чего начать пожалуйста. Добавлено через 20 секунд Программировать соответственно на C++ собираюсь.
C++ Написать программу, которая вводит с клавиатуры последовательность из пяти дробных чисел и после ввода каждого числа выводит среднее арифметическое п Нужна помощь в написание программ на языке С++. буду благодарен. 1. Написать программу, которая вводит с клавиатуры последовательность из пяти дробных чисел и после ввода каждого числа выводит среднее арифметическое полученной части последовательности. 2. Задан числовой массив А. Составить программу поиска элемента массива, который является одновременно наименьшим в строке и наименьшим в своем... http://www.cyberforum.ru/cpp-beginners/thread581903.html
C++ Классы (исправить ошибки)
Исправьте пожалуйста 2 ошибки. Ничего более не надо, просто исправьте. (ошибки в 90 и 92 строке) #include <iostream.h> #include <string.h> class LightDevice
C++ строки в с++
Вычислить, сколько в строке слов, заканчивающихся гласной буквой.
C++ Как написать игру "Цепь"? http://www.cyberforum.ru/cpp-beginners/thread581893.html
• Данное приложение является реализацией известной логической игры. В данной реализации предусматривается игра двух игроков на квадратном поле фиксированного размера. Цель игры - построить непрерывную линию, соединяющую горизонтальные или вертикальные (для каждого из игроков соответственно) стороны игрового поля, причем линия считается непрерывной, если фишки граничат друг с другом по...
C++ Описать структуру с именем Znak Здравствуйте. Помогите пожалуйста изменить сортировку а коде. С сортировки по фамилии на сортировку по дате. Заранее спасибо. Вот условие http://www.cyberforum.ru/attachment.php?attachmentid=154076&stc=1&d=1337622184 Код #include "iostream" #include "time.h" #include "conio.h" using namespace std; struct ZNAK { подробнее

Показать сообщение отдельно
Denis27
4 / 4 / 0
Регистрация: 20.08.2012
Сообщений: 16
06.06.2014, 09:47     фильтр Гаусса
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
        public Pixel[,] CountGauss(double r, int filterSize, Pixel[,] m)
        {
 
            temp = new Pixel[width, height];
 
            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    temp[i, j] = new Pixel();
                    temp[i, j].R = m[i, j].R;
                    temp[i, j].G = m[i, j].G;
                    temp[i, j].B = m[i, j].B;
                }
                    
            }
 
            if (r != 0)
            {
                double[,] blurArray = new double[filterSize, filterSize];
                double div = 0;
                int pixelPosX;
                int pixelPosY;
 
                for (int i = 0; i < filterSize; i++)
                {
                    for (int j = 0; j < filterSize; j++)
                    {
                        blurArray[i, j] = (double)(1 / (Math.PI * 2 * r * r)) * Math.Exp((Math.Abs((filterSize / 2) - i) * Math.Abs((filterSize / 2) - i)) * (-1.0) / (2 * r * r));
                        div += blurArray[i, j];
                    }
                }
 
                for (int y = filterSize / 2; y < height - filterSize / 2; y++)
                {
                    for (int x = filterSize / 2; x < width - filterSize / 2; x++)
                    {
                        double rSum = 0, gSum = 0, bSum = 0, kSum = 0;
 
                        for (int i = 0; i < filterSize; i++)
                        {
                            for (int j = 0; j < filterSize; j++)
                            {
                                pixelPosX = x + j - filterSize / 2;
                                pixelPosY = y + i - filterSize / 2;
 
                                byte red = temp[pixelPosY, pixelPosX].R;
                                byte green = temp[pixelPosY, pixelPosX].G;
                                byte blue = temp[pixelPosY, pixelPosX].B;
 
                                double kernelVal = blurArray[i, j];
 
                                rSum += red * kernelVal;
                                gSum += green * kernelVal;
                                bSum += blue * 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;
 
                        temp[y, x].R = (byte)rSum;
                        temp[y, x].G = (byte)gSum;
                        temp[y, x].B = (byte)bSum;
                    }
                }
            }
 
            return temp;
        }
temp - массив размерами с изображение, содержащий внутри byte объекты R,G,B. blurArray - массив Гаусса с его параметрами. FilterSize - размер матрицы Гаусса. Я скинул этот начальный код, потому что он проще для понимания, хоть и очень тормознутый. Лучше обрабатывать изображение через LockBits. Тогда обработка изображения работает в разы быстрее, но надо работать с одномерным массивом.

Сейчас, чтоб преобразовать массив в изображение, нужно сделать так

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
        public Bitmap SaveTempToBitmap(Pixel[,] temp)
        {
            Bitmap bmp = new Bitmap(width, height);
            BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
 
            byte[] byteBuffer = new byte[bmpData.Stride * bmp.Height];
 
            for (int k = 0, i = 0, j = 0; k < byteBuffer.Length; k += 4)
            {
                if (j >= width)
                {
                    j = 0;
                    i++;
                }
                byteBuffer[k] = temp[i, j].R;
                byteBuffer[k + 1] = temp[i, j].G;
                byteBuffer[k + 2] = temp[i, j].B;
                byteBuffer[k + 3] = 255;
                j++;
            }
 
            System.Runtime.InteropServices.Marshal.Copy(byteBuffer, 0, bmpData.Scan0, byteBuffer.Length);
 
            bmp.UnlockBits(bmpData);
 
            bmpData = null;
            byteBuffer = null;
 
            return bmp;
        }
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru