Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2014, 21:14   #1
skidata
 
Регистрация: 28.12.2010
Сообщений: 3
Стрелка Изображение. Лапласиан(c#)

Цифровая обработка изображений.
Помогите найти ошибку. Сама программа работает без ошибок в отладчике(запускается, выполняется до конца), но изображение, которое сохраняется, весит всего 1000 байтов и вообще пустое.

Почему-то минимальные элементы нулевые, хотя вроде как не должно так быть.

Код:
        private void button1_Click(object sender, EventArgs e)
        {
            
            int[,] mask = new int[,] {  { 0, 1, 0 }, 
                                          { 1, -4, 1 }, 
                                          { 0, 1, 0 } };
            Bitmap image = new Bitmap("1.jpg"); //Основное изображение.;
            int imageWidth = image.Width, 
                imageHeight = image.Height;

                    
            Bitmap result = new Bitmap(imageWidth, imageHeight);

            int[,] redA = new int[imageWidth,imageHeight];
            int[,] greenA = new int[imageWidth, imageHeight];
            int[,] blueA = new int[imageWidth, imageHeight];
            int[,] alphaA = new int[imageWidth, imageHeight];

            for (int i = 2; i < (imageWidth - 1); i++)
                for (int j = 2; j < (imageHeight - 1); j++)
                {
                    int red = 0, green = 0, blue = 0, alpha = 0;
                    for (int x = -1; x <= 1; x++)
                        for (int y = -1; y <= 1; y++)
                        {
                            Color pixel = image.GetPixel(i + x, j + y);
                            red += pixel.R - mask[x + 1, y + 1];
                            green += pixel.G - mask[x + 1, y + 1];
                            blue += pixel.B - mask[x + 1, y + 1];
                            alpha += pixel.A;

                            
                        }
                    redA[i, j] = red;
                    greenA[i, j] = green;
                    blueA[i, j] = blue;
                    alphaA[i, j] = alpha;
                }

            int minr = 0;
            int maxr = 0;

            int ming = 0;
            int maxg = 0;

            int minb = 0;
            int maxb = 0;

            int maxa = 0;
            int mina = 0;

            for (int i = 0; i < imageWidth-1; i++) //min and max element array color
            {
                for (int j = 0; j < imageHeight-1; j++)
                {
                    //min
                    if (minr > redA[i, j])      {minr = redA[i, j];}
                    if (ming > greenA[i, j])    {ming = greenA[i, j];}
                    if (minb > blueA[i, j])     {minb = blueA[i, j];}
                    if (mina > alphaA[i, j])    {mina = alphaA[i, j];}
                    //max
                    if (maxr < redA[i, j])      {maxr = redA[i, j];}
                    if (maxg < greenA[i, j])    {maxg = greenA[i, j];}
                    if (maxb < blueA[i, j])     {maxb = blueA[i, j]; }
                    if (maxa < alphaA[i, j])    {maxa = alphaA[i, j];}
                    }
                }
            

            for (int x = 0; x < imageWidth-1; x++) //delete min and max
            {
                for (int y = 0; y < imageHeight-1; y++)
                {
                    redA[x,y] = redA[x,y] - minr;
                    greenA[x,y] = greenA[x,y] - ming;
                    blueA[x,y] = blueA[x,y] - minb;
                    alphaA[x,y] = alphaA[x,y] - mina;

                    redA[x,y] = redA[x,y]*(255/maxr);
                    greenA[x,y] = greenA[x,y]*(255/maxr);
                    blueA[x,y] = blueA[x,y]*(255/maxr);
                    alphaA[x,y] = alphaA[x,y]*(255/maxr);

                    result.SetPixel(x, y, Color.FromArgb(
                    (int)(alphaA[x,y]),
                    (int)(redA[x, y]),
                    (int)(greenA[x, y]),
                    (int)(blueA[x, y])));

                }
            }


            pictureBox1.ImageLocation = "1.jpg";
            pictureBox2.Image = result; //Выводим.
            result.Save("result.jpg");


        }
skidata вне форума Ответить с цитированием
Старый 29.04.2014, 22:07   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Не смотрел весь код. Если минимумы инициализированы нулевыми значениями (в коде), а в данных только положительные числа, то минимум так и останется 0. Нужно минимумы инициализировать максимальными числами.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.04.2014 в 22:11.
BDA вне форума Ответить с цитированием
Старый 29.04.2014, 22:16   #3
skidata
 
Регистрация: 28.12.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не смотрел весь код. Если минимумы инициализированы нулевыми значениями (в коде), а в данных только положительные числа, что минимум так и останется 0. Нужно минимумы инициализировать максимальными числами.
Вообще фильтр вроде так устроен, что отрицательные числа всегда есть.
Поставил минимальные значения на 255, все равно ничего не изменилось
skidata вне форума Ответить с цитированием
Старый 29.04.2014, 23:44   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
private void button1_Click(object sender, EventArgs e)
        {

            int[,] mask = new int[,] {  { 0, 1, 0 }, 
                                          { 1, -4, 1 }, 
                                          { 0, 1, 0 } };
            Bitmap image = new Bitmap("1.jpg"); //Основное изображение.;
            int imageWidth = image.Width,
                imageHeight = image.Height;

            Bitmap result = new Bitmap(imageWidth, imageHeight);

            int[,] redA = new int[imageWidth, imageHeight];
            int[,] greenA = new int[imageWidth, imageHeight];
            int[,] blueA = new int[imageWidth, imageHeight];
            int[,] alphaA = new int[imageWidth, imageHeight];

            for (int i = 1; i < imageWidth - 1; i++)
                for (int j = 1; j < imageHeight - 1; j++)
                {
                    int red = 0, green = 0, blue = 0, alpha = 0;
                    for (int x = -1; x <= 1; x++)
                        for (int y = -1; y <= 1; y++)
                        {
                            Color pixel = image.GetPixel(i + x, j + y);
                            red += pixel.R * mask[x + 1, y + 1];
                            green += pixel.G * mask[x + 1, y + 1];
                            blue += pixel.B * mask[x + 1, y + 1];
                            alpha += pixel.A * mask[x + 1, y + 1];
                        }
                    redA[i, j] = red;
                    greenA[i, j] = green;
                    blueA[i, j] = blue;
                    alphaA[i, j] = alpha;
                }

            int minr = Int32.MaxValue;
            int maxr = Int32.MinValue;

            int ming = Int32.MaxValue;
            int maxg = Int32.MinValue;

            int minb = Int32.MaxValue;
            int maxb = Int32.MinValue;

            int mina = Int32.MaxValue;
            int maxa = Int32.MinValue;

            for (int i = 1; i < imageWidth - 1; i++) //min and max element array color
            {
                for (int j = 1; j < imageHeight - 1; j++)
                {
                    //min
                    if (minr > redA[i, j]) { minr = redA[i, j]; }
                    if (ming > greenA[i, j]) { ming = greenA[i, j]; }
                    if (minb > blueA[i, j]) { minb = blueA[i, j]; }
                    if (mina > alphaA[i, j]) { mina = alphaA[i, j]; }
                    //max
                    if (maxr < redA[i, j]) { maxr = redA[i, j]; }
                    if (maxg < greenA[i, j]) { maxg = greenA[i, j]; }
                    if (maxb < blueA[i, j]) { maxb = blueA[i, j]; }
                    if (maxa < alphaA[i, j]) { maxa = alphaA[i, j]; }
                }
            }

            for (int x = 1; x < imageWidth - 1; x++) //delete min and max
            {
                for (int y = 1; y < imageHeight - 1; y++)
                {
                    redA[x, y] = redA[x, y] - minr;
                    greenA[x, y] = greenA[x, y] - ming;
                    blueA[x, y] = blueA[x, y] - minb;
                    alphaA[x, y] = alphaA[x, y] - mina;

                    redA[x, y] = redA[x, y] * 255 / (maxr - minr);
                    greenA[x, y] = greenA[x, y] * 255 / (maxg - ming);
                    blueA[x, y] = blueA[x, y] * 255 / (maxb - minb);
                    alphaA[x, y] = 255;// alphaA[x, y] * (255 / maxa - mina);

                    result.SetPixel(x, y, Color.FromArgb(
                    (int)(alphaA[x, y]),
                    (int)(redA[x, y]),
                    (int)(greenA[x, y]),
                    (int)(blueA[x, y])));
                }
            }

            //pictureBox1.ImageLocation = "1.jpg";
            //pictureBox2.Image = result; //Выводим.
            result.Save("result.jpg");
            image.Dispose();
            result.Dispose();
        }
Альфа канал никак не обрабатывается. Рамка в 1 пиксель никак не обрабатывается.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 30.04.2014 в 08:33.
BDA вне форума Ответить с цитированием
Старый 30.04.2014, 07:39   #5
skidata
 
Регистрация: 28.12.2010
Сообщений: 3
По умолчанию

RКак же я Вам благодарен, добрый человек. Сам бы ни за что не додумался
skidata вне форума Ответить с цитированием
Старый 30.04.2014, 08:37   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Пожалуйста. Кстати, исправил границы у циклов, а то выбрасывалось по 2 пикселя справа и снизу.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изображение GriFFoN PHP 1 08.03.2013 17:33
Изображение на изображение ара Мультимедиа в Delphi 0 19.10.2011 11:43
Изображение whitebrain Общие вопросы .NET 1 09.03.2011 19:37
Изображение _-Re@l-_ Общие вопросы Delphi 7 09.06.2010 09:23
Изображение Artem Мультимедиа в Delphi 10 13.07.2007 13:27