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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Soul-rise
0 / 0 / 0
Регистрация: 26.05.2011
Сообщений: 14
21.05.2012, 22:00     фильтр Гаусса #1
надо написать фильтр гаусса... после попыток его написать изображение почему то затемняется... хотя вроде по алгоритмам верным... вот наработка..
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
    double s=0;
    double r=1.398;
    double r2=2*r*r;
    int n=3;
    double ss;
    double color;
    double** w=new double*[n];
    for(int i=0;i<n;i++){
        w[i]=new double[n];
    }
    for (int i =0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            ss=(i*i+j*j)/r2;
            w[i][j]=1/(sqrt(M_PI*r2))*exp(ss*(-1.0));
            //cout<<w[i][j]<<endl;
            s+=w[i][j];
        }
        for (int j = 0; j < n; j++)
        {
            
            w[i][j]=w[i][j]/s;
        }
    }
    for (int yi =n; yi < height-n; yi++)
    {
        for (int xj = n; xj < width-n; xj++)
        {
                for (int i =0; i < n; i++)
                {color=0;
                    for (int j = 0; j < n; j++)
                    {
                        color+=w[i][j]*LightMap[(int)(i+yi)][(int)(j+xj)];
                    }
                }
                LightMap[(int)(yi)][(int)(xj)] =color;
        }
    }
LightMap двумерный массив с насыщенностью цветов изображения( градация серого) в чем ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 22:00     фильтр Гаусса
Посмотрите здесь:

Метод Гаусса!!! C++
Метод Гаусса в С++ C++
метод Гаусса C++
Метод Гаусса C++
метод Гаусса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Denis27
4 / 4 / 0
Регистрация: 20.08.2012
Сообщений: 16
05.01.2013, 00:38     фильтр Гаусса #2
тоже была такая проблема на C#. Все дело в нормировке. Нужно поделить твой редактируемый пиксель с примененным фильтром на сумму элементов твоей матрицы гаусса
Gector_mc
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 2
06.06.2014, 09:38     фильтр Гаусса #3
Denis27, а можешь выложить код, как ты реализовал фильтр гаусса на C#!? У меня вот тоже не получается убрать затемнение картинки после размытия(
Denis27
4 / 4 / 0
Регистрация: 20.08.2012
Сообщений: 16
06.06.2014, 09:47     фильтр Гаусса #4
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;
        }
Yandex
Объявления
06.06.2014, 09:47     фильтр Гаусса
Ответ Создать тему
Опции темы

Текущее время: 23:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru