С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
myself
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
1

реализация медианного фильтра

22.05.2013, 15:27. Просмотров 735. Ответов 0
Метки нет (Все метки)

помогите пожадуйста с программой, медиальный фильтр, в конце в фор суммирует цвета для каждого пикселя, а потом их сортирует чтобы найти среднее, потом сравнивает его во втором форе с суммой других, и если нашёл такую же сумму-то записывает цвет этого пикселя в результирующее изображение. Как сделать так, чтобы не суммировало цвета, а сортировало по самим пикселям, и среднее записывало в результирующее изображение( то есть одним фором)?Препод сказал что есть какая-то специальная функция которой это можно сделать в c#.

вот код
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
Bitmap MedianPhilter(Picture orig_img, int rad)
         {
             Picture result_img = new Picture(orig_img.bmp.Width, orig_img.bmp.Height,
                                             orig_img.bmp.PixelFormat, orig_img.typeOfPixel);
             for (int i = 0; i < orig_img.bmp.Height; i++)
                 for (int j = 0; j < orig_img.bmp.Width; j++)
                 {
                     if (i >= rad && j >= rad && j <= (orig_img.bmp.Width - rad) && i <= (orig_img.bmp.Height - rad))//проверка на границы
                     {
                         List<int> PixelsValues = new List<int>();//список соседних пикселей
                         for (int k = -rad / 2; k < rad / 2 + 1; k++)
                         {
                             for (int l = -rad / 2; l < rad / 2 + 1; l++)
                             {
                                 PixelsValues.Add((int)orig_img.GetPixel(j - l, i - k)[0] + (int)orig_img.GetPixel(j - l, i - k)[1]
                                     + (int)orig_img.GetPixel(j - l, i - k)[2]);//добовляем соседние пиксели в массив и ссумируем цвета (ВОТ ОТ СЮДА НАДО ПЕРЕДЕЛАТЬ, ЧТОБ НЕ СКЛАДЫВАЛО ЦВЕТА)
                             }
                         }
                         PixelsValues.Sort();
                         int pValue = PixelsValues[PixelsValues.Count / 2];
                         for (int k = -rad / 2; k < rad / 2 + 1; k++)
                         {
                             bool flag = false;
                             for (int l = -rad / 2; l < rad / 2 + 1; l++)
                             {
                                 int Value = (int)orig_img.GetPixel(j - l, i - k)[0] + (int)orig_img.GetPixel(j - l, i - k)[1]
                                     + (int)orig_img.GetPixel(j - l, i - k)[2];
                                 if (Value == pValue) { result_img.SetPixel(j, i, orig_img.GetPixel(j - l, i - k)); flag = true; }
                             }
                             if (flag) break;
                         }
                     }
                     else result_img.SetPixel(j,i,orig_img.GetPixel(j,i));
                 }       
             return result_img.bmp;
         }
здесь отдельные классы для работы с изображением
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
class Picture
     {
         public Bitmap bmp;
         byte[] Pixels;
         public int typeOfPixel; 
         BitmapData bmpData;
         IntPtr ptr;
         Rectangle rectngl;
 
         public Picture(Image orig_img)//конструктор если имеется исходное изображение
         {
             bmp = new Bitmap(orig_img);// orig_img;
             rectngl = new Rectangle(0, 0, orig_img.Width, orig_img.Height);
             bmpData = bmp.LockBits(rectngl, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);//orig_img.PixelFormat);
             ptr = bmpData.Scan0;
             int numBytes = orig_img.Height * orig_img.Width * 4; //bmpData.Stride * orig_img.Height; //размерность массива
             typeOfPixel = 4;// bmpData.Stride / orig_img.Width; //количество байт на пиксель
             Pixels = new byte[numBytes];
             Marshal.Copy(ptr, Pixels, 0, numBytes);
             //FreeMemory();
         }
 
         public Picture(int width, int height, PixelFormat format, int type) //конструктор если изображение создается
         {
             bmp = new Bitmap(width, height, format);
             rectngl = new Rectangle(0, 0, width, height);
             typeOfPixel = type; //количество байт на пиксель
             bmpData = bmp.LockBits(rectngl, ImageLockMode.ReadWrite, bmp.PixelFormat);
             ptr = bmpData.Scan0;
             int numBytes = width * height* typeOfPixel; //размерность массива
             Pixels = new byte[numBytes];
         }
 
         public void SetPixel(int x, int y, byte[] color)
         {
             int offset = (y * bmp.Width + x) * typeOfPixel;
             Marshal.Copy(color, 0, ptr+offset, typeOfPixel);
         }
 
         public byte[] GetPixel(int x, int y)
         {
             byte[] color = new byte[typeOfPixel];
             int offset = (y * bmp.Width + x) * typeOfPixel;
             Marshal.Copy(ptr + offset, color, 0, typeOfPixel);
             return color;
         }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 15:27
Ответы с готовыми решениями:

Реализация фильтра в ListView
Здравствуйте! Есть ListView в который заносятся координаты точек (x1;y1)....

Реализация фильтра низких частот
Добрый день! Подскажите пожалуйста, как реализовать программно ФНЧ. Из...

Получение данных из DS фильтра x264
Добрый &lt;Trunc(DateTime.Now)&gt;. Передо мной стоит следующая задача нужно...

Создание фильтра Linq запросом
using System; using System.Collections.Generic; using System.ComponentModel;...

ProgressBar: отображать процесс применения фильтра
хочу подключить прогресбар к программе, которая фильтрует изображения. вот код...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2013, 15:27

Реализация медианного фильтра с применением sse2
Не знаю, на сколько это для начинающих. Но я только начинаю вникать в суть...

Реализация алгоритма реализации медианного фильтра с использованием LINQ
Вот задание с ресурса ulearn: &quot;Практика «Медианный фильтр» Продолжайте в том...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru