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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2015, 14:22   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию Фильтры "Среднее на пересечении" и "Среднее по квадрату"

Возможно будет проходить знаток и подскажет формулу, а пока я сам пытаюсь вычислять.
А для остальных задачка + штурм мозга.
Для матрицы 3х3
//среднее на пересечении
010 010
001 =111
010 010
//Среднее по кведрату
110 010
001 =011
110 110
Как это выглядит на картинке:


В побитовой обработке мне куда проще первое что пришло в голову это:
(pRow1[i-1]+pRow1[i+1]+pRow15[i]+pRow25[i]) shr 2
Но поигравшись с результатами и калькулятором, понял что не то, пробовал комбинации битовых опираций, тоже не то, есть идеи?
Я потом понял что там берется большее (или доминирующее) из 4х цветов, но как это выразить уже вторые сутки голову ломаю.

Сейчас на более свежую голову расписав все на бумаге понимаю что:
нужно решить просто следующую систему уравнений
х - это какая-то операция
1х1х1х0=1
0х0х0х1=0
проблема в случае что 0х0х1х1=результат не меняется т.е. это может быть частный случай.


П.С. Фильтры из XnView

Последний раз редактировалось IvaniuS; 19.12.2015 в 15:01.
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 16:33   #2
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Для черно белого изображения, получилось что-то вроде этого (Если сумма меньше 3 значит черный, иначе белый)):
Код:
Buffer := TBitmap.Create;
        Try
          Buffer.Assign(bImg);
        //среднее на пересечении
        {010   010
         101 = 111
         010   010}
          For j := bImg.Height - 2 Downto 1 Do
          Begin
            Row0 := (Buffer.Scanline[j]);
            Row15 := (bImg.Scanline[j - 1]);
            Row := (bImg.Scanline[j]);
            Row25 := (bImg.Scanline[j + 1]);
            For i := bImg.Width - 2 Downto 1 Do
            Begin
              If (Row[i] + Row[i - 1] + Row[i + 1] + Row15[i] + Row25[i]) < $2FD Then
                Row0[i] := 0
              Else
                Row0[i] := $FF; 
            End;
          End;
          bImg.Assign(Buffer);
        Finally
          Buffer.Free;
        End;
Но вот как быть с цветным изображением ...
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 17:38   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Честно говоря, не понял вашего описания.
1) Что значит "среднее по пересечению", "среднее по квадрату"?
2) Что означает, что левая матрица равна правой? (Из левой получается правая или что?)
3) Не понял, что именно изображено на картинке. Из левого столбца получается правый столбец картинок?
4) Вам нужно среднее или доминирующий цвет из определенных позиций вокруг рассматриваемой точки?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.12.2015, 18:14   #4
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Честно говоря, не понял вашего описания.
1) Что значит "среднее по пересечению", "среднее по квадрату"?
2) Что означает, что левая матрица равна правой? (Из левой получается правая или что?)
3) Не понял, что именно изображено на картинке. Из левого столбца получается правый столбец картинок?
4) Вам нужно среднее или доминирующий цвет из определенных позиций вокруг рассматриваемой точки?
Да я уже разобрался, только проблемы в реализации остались.
1)После долгих мучений это получается в 3х3 квадрате пикселей, если по квадрату то 9 пикселей сортируется по возрастанию\убыванию и берется 5е значение, а среднее по пересечению - 5 пикселей сортируются и берется "среднее" 3е значение уже.
2,3)Да из левого получается правый.
4)Мне нужно быстро, не знаю как оперировать чтобы было быстро это получается массив RGB из 5 или 9 значений окружающих и берется среднее значение после сортировки, пример для пересечения:
R G B
83 84 248
83 84 248
248 0 0
255 255 255
255 255 255
Сортируем каждую компонентку в отедльности и получаем
R G B
83 0 0
83 84 0
248 84 248
255 255 255
255 255 255
т.е. цвет будет 248 84 248
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 20:04   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Наверное сохранить нужные значения в массив, затем произвести сортировку вставками (погуглил, вроде оптимальная для малых размеров массива).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.12.2015, 20:41   #6
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

будет очень долго , нужно за 1-2 прохода максиумм определить середину, думаю есть какой-то метод не сортировки, а определения середины, сейчас еще подумаю что-то можно для этого использовать.
Слава богу хоть понял что и как нужно и на битовом изображении уже работает, очень полезная вещь в обработке текста, для распознавания тессерактом, что я и делаю. Но довести до ума эти все фильтры хотелось бы.
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 21:14   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Да, и правда есть за O(n) - алгоритм выбора.
UPD Почитал - он основывается на сортировке, так что никакой выгоды на размере 5/9 элементов не даст.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.12.2015 в 21:17.
BDA на форуме Ответить с цитированием
Старый 19.12.2015, 23:15   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Не пишите как сделать. Вы всё равно не знаете.
Когда задаёте вопрос пишите условие ограничивающие вашу задачу. Описывайте что дано и что надо сделать.
Во-вторых следите за речью. Вас понять невозможно.
"Среднее на пересечении" Пересечение чего? Двух линий? Пересечение двух линий это точка. Точка это сколько элементов? Это один элемент.
Среднее одного элемента есть этот самый
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 20.12.2015, 00:48   #9
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Не знаю, но стараюсь разобраться в вопросе самостоятельно, потому озвучиваю свои варианты. Спасибо за совет, постараюсь в будущем так и делать.
По поводу понять невозможно, оперирую тем что знаю (на изображении название фильтров):

Но проблемы с изложением все-таки есть, теряю ход мысли достаточно часто.
IvaniuS вне форума Ответить с цитированием
Старый 20.12.2015, 16:22   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Pavia, в оригинале (в XnView) фильтры называются Median Cross, Median Box, что тоже не очень помогает понять точный способ их действия.
IvaniuS, почему все-таки долго? Большие картинки нужно фильтровать или много?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
дополнить программу условием:"Определить среднее арифметическое значений функций, меньших 1" wowan Паскаль, Turbo Pascal, PascalABC.NET 2 22.06.2011 16:25
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04