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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2015, 19:59   #11
Mr.Dmitry
Пользователь
 
Аватар для Mr.Dmitry
 
Регистрация: 18.12.2006
Сообщений: 50
По умолчанию

Нашел вот такую статью на хабре

http://habrahabr.ru/post/62738/


И нашел вот такой код на С#


Код:
MyImageFilter = new Bitmap(Image.FromFile(MyFileName));
int width = MyImageFilter.Width;
int height = MyImageFilter.Height;
Color pixel;

//i-столбец,j-строка
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {

double rSum = 0, gSum = 0, bSum = 0, kSum = 0;

for (int x = 0; x < 3; x++) {
for (int y=0; y < 3; y++) {
int pixelPosX = i + (x - (3 / 2));
int pixelPosY = j + (y - (3/ 2));

if ((pixelPosX < 0) ||
(pixelPosX >= width) ||
(pixelPosY < 0) ||
(pixelPosY >= height)) continue;

pixel = MyImageFilter.GetPixel(pixelPosX, pixelPosY);

rSum += pixel.R / 9;// (1 / 9);
gSum += pixel.G / 9;// (1 / 9);
bSum += pixel.B / 9;//(1/9);

kSum += (1 / 9);
}
}

if (kSum <= 0) kSum = 1;
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;

MyImageFilter.SetPixel(i, j, Color.FromArgb((int)rSum, (int)gSum, (int)bSum));
}
}
pictureBox2.Image = MyImageFilter;
}
Но этот код делает низкочастотную фильтрацию с ядром 1. Может ктонибуть знает как сделать высокочастотную фильтрацию с ядром 3?

Последний раз редактировалось Mr.Dmitry; 08.10.2015 в 20:01.
Mr.Dmitry вне форума Ответить с цитированием
Старый 08.10.2015, 20:15   #12
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

У вас фильтр с ядром 3х3, а не 1.
Цитата:
. Может ктонибуть знает как сделать высокочастотную фильтрацию с ядром 3?
У Вас есть Фильтр нижних частот. Так вот вычитаешь его результат из исходного изображения у тебя остаются высокие частоты. Это же очевидно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 08.10.2015 в 20:23.
Pavia вне форума Ответить с цитированием
Старый 08.10.2015, 20:41   #13
Mr.Dmitry
Пользователь
 
Аватар для Mr.Dmitry
 
Регистрация: 18.12.2006
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
У вас фильтр с ядром 3х3, а не 1.

У Вас есть Фильтр нижних частот. Так вот вычитаешь его результат из исходного изображения у тебя остаются высокие частоты. Это же очевидно.
Ну честно говоря я в этом не шарю, всю жизнь кодил на Делфи. Там я с таким не встречался, так что то что очевидно для вас для меня совсем не очевидно и не понятно. И даже то что вы написали я не понял )) Ткните мне пальцем где у меня есть фильтр нижних частот?
Mr.Dmitry вне форума Ответить с цитированием
Старый 08.10.2015, 21:28   #14
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Ткните мне пальцем где у меня есть фильтр нижних частот?
Вот этот код и есть фильтр. Вы же сами написали что он делает низкочастотную фильтрацию. Т.е. после обработки на картинке останутся только гармоники с низкой частотой, а гармоники с высокой частотой ослабнут/исчезнут.


Цитата:
Сообщение от Mr.Dmitry Посмотреть сообщение
Нашел вот такую статью на хабре

http://habrahabr.ru/post/62738/


И нашел вот такой код на С#


Код:
MyImageFilter = new Bitmap(Image.FromFile(MyFileName));
int width = MyImageFilter.Width;
int height = MyImageFilter.Height;
Color pixel;

//i-столбец,j-строка
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {

double rSum = 0, gSum = 0, bSum = 0, kSum = 0;

for (int x = 0; x < 3; x++) {
for (int y=0; y < 3; y++) {
int pixelPosX = i + (x - (3 / 2));
int pixelPosY = j + (y - (3/ 2));

if ((pixelPosX < 0) ||
(pixelPosX >= width) ||
(pixelPosY < 0) ||
(pixelPosY >= height)) continue;

pixel = MyImageFilter.GetPixel(pixelPosX, pixelPosY);

rSum += pixel.R / 9;// (1 / 9);
gSum += pixel.G / 9;// (1 / 9);
bSum += pixel.B / 9;//(1/9);

kSum += (1 / 9);
}
}

if (kSum <= 0) kSum = 1;
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;

MyImageFilter.SetPixel(i, j, Color.FromArgb((int)rSum, (int)gSum, (int)bSum));
}
}
pictureBox2.Image = MyImageFilter;
}
Но этот код делает низкочастотную фильтрацию с ядром 1. Может ктонибуть знает как сделать высокочастотную фильтрацию с ядром 3?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 08.10.2015 в 21:33.
Pavia вне форума Ответить с цитированием
Старый 08.10.2015, 21:55   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В приведенном вами коде реализована первая матрица из второй строки.
Изображения
Тип файла: jpg ядра.jpg (27.1 Кб, 114 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 08.10.2015 в 21:59.
BDA вне форума Ответить с цитированием
Старый 09.10.2015, 16:52   #16
Mr.Dmitry
Пользователь
 
Аватар для Mr.Dmitry
 
Регистрация: 18.12.2006
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В приведенном вами коде реализована первая матрица из второй строки.
Стыдно спросить, но все же, а какую матрицу нужно использовать мне? в привиденном вами рисунки матрицы А(Низко частотные) подписаны 1/9 1/10 и т.д А вот Б матрицы не подписаны.
Mr.Dmitry вне форума Ответить с цитированием
Старый 09.10.2015, 17:50   #17
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Я бы попробовал через https://ru.wikipedia.org/wiki/YUV сделать.
Типа из RGB получаем YUV, заменяем UV нулями или единицами или чем там надо и из этого получаем опять RGB, яркость именно что не трогаем, цвета выкидываем.
pu4koff вне форума Ответить с цитированием
Старый 10.10.2015, 00:53   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Mr.Dmitry Посмотреть сообщение
Стыдно спросить, но все же, а какую матрицу нужно использовать мне? в привиденном вами рисунки матрицы А(Низко частотные) подписаны 1/9 1/10 и т.д А вот Б матрицы не подписаны.
Это не подписи, а множитель для нормирования, чтобы общая сумма матрицы была равна единице, а у приведенных высокочастотных и так сумма равна единице. Вы сделайте массив константный для матрицы, забейте в него какую-нибудь матрицу и примените. Если не понравится, то другую попробуйте. Результат работы своей программы можно сравнивать с GIMP (фильтр "Матрица свертки" http://habrahabr.ru/post/142818/).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение изображения с ФРАГМЕНТОМ другого изображения egorka2134 Общие вопросы Delphi 8 13.08.2013 19:04
Классы. Чтение и создание .bmp изображения. Пропадает 1 пиксел при создании изображения. s-mumrik Visual C++ 3 12.04.2013 21:21
обесцвечивание изображения с прозрачность CepbIu PHP 2 25.02.2011 01:06
Чтение изображения из базы данных, Вместо изображения - "System.Byte[]" ruelCrow Общие вопросы .NET 3 10.07.2008 23:29
Изображения в БД alikon1 БД в Delphi 3 08.10.2007 13:13