Исследовательский проект "Цифровая оптика" .

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 27.07.2017 20:36:15

Решил сделать интегральное продолжение уже начатых мной ранее тем ...

Изображение


Windows 10 и захват кадра из видеопотока с камеры
Серия проектов "Дополнение к реальности "
Tempus fugit !... (Видео: " ускорение & перестройка" )
Виртуальная и"аргументированная" реальность. Ждем Бума?

И так пока продолжаю разработку внезапно начатую в поезде дальнего следования .... :idea:

ИзображениеИзображение

ИзображениеИзображение

:idea: :arrow: "Подзорная труба" версии 0.0057
Добавил опцию "зеркало" (для датчика движения )
Добавил дату и время (в хинт миниатюры и и при увеличении )
Добавил запись части настроек в ини-файл ...
Добавил сохранение и загрузку "галереи слежения
(И соответствующую поддержку этой функции в программе )

Вообщем "в первом проходе" почти всю функциональность простой системы слежения можно сказать ИССЛЕДОВАЛ !

Далее планирую :
1 Добавить новую редакцию функции "Супер зум "
Что это такое? А вот что !
Изображение
То есть есть РЯД КАДРОВ низкого разрешения на основе которых я хочу получить один кадр ВЫСОКОГО разрешения .

2 Добавить бар-фильтров
Ну тут думаю все понятно ? Увеличение резкости , размывание, разные цветовые коррекции и т.д. ...
3 Добавить "смесь слежения и распознавания" ... То есть выделяю на кадре участок как образ и слежу социально за ним .

4 Режим "стерео визира " (Изображение с двух камер превращается в стерео картинку) ...

и т.д. постепенно уходя куда-то в строну расширенной и виртуальной реальности .... :idea: :arrow: 8)

Ps
Интересны любые идеи по развитию плана исследований и вообще по теме обработки изображений в реальном времени ...
И может кто-то еще видел похожие темы на форуме ?
("Изобретение велосипедов" дело почетное и необходимое... :wink: однако, с полного нуля начинать "в лом" ! :idea: )
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение MysticCoder » 28.07.2017 01:31:40

Построение 3д модели пространства в идеале имея на входе одну двигающуюся видеокамеру :) Можно будет 3д модельки сканировать :)
MysticCoder
постоялец
 
Сообщения: 118
Зарегистрирован: 14.09.2013 00:20:28

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 28.07.2017 08:32:22

MysticCoder писал(а):Построение 3д модели пространства в идеале имея на входе одну двигающуюся видеокамеру Можно будет 3д модельки сканировать


Вообще-то возможно ... Microsoft HoloLens вроде умеет ...

https://ru.wikipedia.org/wiki/Microsoft_HoloLens
«голографическая телепортация» (англ. holoportation)[15], позволяющая с помощью специальных камер (как утверждается, минимально необходимое количество камер — 2, использование большего количества камер позволяет улучшить качество) в реальном времени захватить 3D-модель человека и воспроизвести перед носителем HoloLens.


Правда как к этому подступится пока не знаю ... Проще сделать расширенную реальность с маркерами виртуальной клавиатурой и виртуальными экранами.
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 02.08.2017 01:39:53

Реальность все расширяется и расширяется... :D

ИзображениеИзображение

ИзображениеИзображение

ИзображениеИзображение
Начинаю новой этап исследований! Планов как видно по скриншотам громадье ...

Но из новых функций работает только "Супер Зум" в окне которого я победил даже подлое так вредно действующее мне на нервы мерцание !
(Секрет прост нужно рисовать на битмаме а после выводить его на PaintBox в PaintBoxPaint (по OnPaint) )

:arrow: Truba_DS_0_0058.7z :idea:


Сам по себе "Супер Зум" пока сделан только немного лучше чем в старой версии на ХайАсме ..
(Есть выбор количества кадров из которых собирается нечто пока напоминающее вид стену из стеклянных блоков или витраж
но идея напрашивается ... кадры даже условно статичного изображения чуть отличаются друг от друга а значит совокупно несут больше информации чем один кадр
и моя задача найти способ извлечь ее получая на выходе более высокое разрешение )

Пока просто беру 2х2 3х3 4х4 и тд кадра и складываю их пиксели по квадратам в один "псевдо пиксель " и строю из них "суммарную картинку" ...
Ясный пень результат полученный таким несложным методом оставляет желать лучшего ... но даже сейчас уже при 64 кадрах видно что в принципе эффект увеличение разрешения получить реально ! Эдакий Anti-Motorn-Blur ( или верно Anti Motion Blur) :!: :idea:

Интересно никто про что-то похожее не слышал ? Не может же быть быть что бы я додумался до подобной идеи первым ! :roll:
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Pavia » 02.08.2017 07:01:10

Идея не нова. Но нужно что-бы камера качалась из стороны в сторону.
Мне нравиться идея супер-рес. Там достаточно одного изображения, но никто правда не раскрывает деталей как её сделать. Но я предполагаю сделать так. Нужно восстановить линии(границы) и плавные переходы.
Первое реализуется поиском границ второе функцией размытия. Достаточно обучить НС для подбора коэффициентов и натравить обученную НС на новое изображение.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 172
Зарегистрирован: 07.01.2011 12:46:51

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 03.08.2017 03:11:49

Pavia писал(а):Мне нравиться идея супер-рес...

Вообще-то есть легендарное фрактальное сжатие... (Там можно увеличивать "близко к смыслу" раз в сто и более ) или более банальная трассировка в векторный аналог ( в полоть до построения 3D модели )

Ну пока все читатели темы тихо обтекают от сих "откровений"... я тут уже кое что прикрутил под флажок с многозначительным обозначением "FX "
(На самом деле это пока это довольно примитивный АнтиАлайзинг + Чуть подкручиваю контраст ....)

Кстати, вот код пока немногих переписных для Лазаруса +LCL "Спец эффектов "...

Код: Выделить всё
procedure AntiAliasRect(var Clip: TBitmap; XOrigin,YOrigin,XFinal,YFinal: integer);
var Memo,X,Y: integer; (* Composantes primaires des points environnants *)
    P0,P1,P2: PByteArray;
begin
   if XFinal<XOrigin then
     begin
       Memo:=XOrigin;
       XOrigin:=XFinal;
       XFinal:=Memo;
     end;  (* Inversion des valeurs   *)
   if YFinal<YOrigin then
     begin
       Memo:=YOrigin;
       YOrigin:=YFinal;
       YFinal:=Memo;
     end;  (* si diff‚rence n‚gative*)
   XOrigin:=Max(1,XOrigin);
   YOrigin:=Max(1,YOrigin);
   XFinal:=Min(Clip.Width-2,XFinal);
   YFinal:=Min(Clip.Height-2,YFinal);
   Clip.PixelFormat:=pf24bit;
   for Y:=YOrigin to YFinal do
     begin
     Clip.BeginUpdate(False);
       P0:=Clip.ScanLine[Y-1];
       P1:=Clip.ScanLine[Y];
       P2:=Clip.ScanLine[Y+1];
       for X:=XOrigin to XFinal do
         begin
           P1[X*3]:=(P0[X*3]+P2[X*3]+P1[(X-1)*3]+P1[(x+1)*3]) div 4;
           P1[X*3+1]:=(P0[X*3+1]+P2[X*3+1]+P1[(X-1)*3+1]+P1[(X+1)*3+1]) div 4;
           P1[X*3+2]:=(P0[X*3+2]+P2[X*3+2]+P1[(X-1)*3+2]+P1[(X+1)*3+2]) div 4;
         end;
       Clip.EndUpdate(False);
     end;
end;
function TriangleFilter(Value: single): single;
begin
  if (Value<0.0) then Value:=-Value;
  if (Value<1.0) then Result:=1.0-Value else Result:=0.0;
end;

function Int2Byte(I: integer): byte;
begin
  if I>255 then Result:=255 else
    if I<0 then Result:=0 else Result:=I;
end;

procedure Contrast(var Clip: TBitmap; Amount: integer);
var P0: PByteArray;
    RG,GG,BG,R,G,B,X,Y: integer;
begin
  for Y:=0 to pred(Clip.Height) do
    begin
      Clip.BeginUpdate(False);
      P0:=Clip.ScanLine[Y];
      for X:=0 to pred(Clip.Width) do
        begin
          R:=P0[X*3];
          G:=P0[X*3+1];
          B:=P0[X*3+2];
          RG:=(Abs(127-R)*Amount) div 255;
          GG:=(Abs(127-G)*Amount) div 255;
          BG:=(Abs(127-B)*Amount) div 255;
          if R>127 then R:=R+RG else R:=R-RG;
          if G>127 then G:=G+GG else G:=G-GG;
          if B>127 then B:=B+BG else B:=B-BG;
          P0[X*3]:=Int2Byte (R);
          P0[X*3+1]:=Int2Byte(G);
          P0[X*3+2]:=Int2Byte(B);
        end;
    Clip.EndUpdate(False);
    end;
end;
procedure Lightness(var Clip: TBitmap; Amount: integer);
var P0: PByteArray;
    R,G,B,X,Y: integer;
begin
  for Y:=0 to pred(Clip.Height) do
    begin
      Clip.BeginUpdate(False);
      P0:=Clip.ScanLine[Y];
      for X:=0 to pred(Clip.Width) do
        begin
          R:=P0[X*3];
          G:=P0[X*3+1];
          B:=P0[X*3+2];
          P0[X*3]:=Int2Byte(R+((255-R)*Amount) div 255);
          P0[X*3+1]:=Int2Byte(G+((255-G)*Amount) div 255);
          P0[X*3+2]:=Int2Byte(B+((255-B)*Amount) div 255);
        end;
      Clip.EndUpdate(False);
    end;
end;

А что получилось ? Ну кое что определенно получается ( Видно "просто увеличение" и Супер Зум )

ИзображениеИзображение
Собственно обновленная версия софтинки ...
:arrow: Truba_DS_0_0058_1.7z :idea:
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Лекс Айрин » 03.08.2017 09:32:19

Alex2013 писал(а):Вообще-то есть легендарное фрактальное сжатие...


Боюсь, что именно легендарное.Как то пробовал фрактальное увеличение...лучше, чем обычное, но до вектора ему еще далеко.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4181
Зарегистрирован: 19.02.2013 16:54:51

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 05.08.2017 02:51:27

Лекс Айрин писал(а):Как то пробовал фрактальное увеличение...лучше, чем обычное, но до вектора ему еще далеко.

Я тоже пробовал погонять ... и понял что реализация заточена под максимальное уменьшение размера файла ...
Если сделать иначе (пусть даже размер будет равен несжатому формату BMP или PNG )то эффект будет гораздо лучше .
Там просто ИДЕЯ мощная ... подобрать фрактал описывающий картинку ... а главное свойство фрактала как раз в возможности масштабирования "до потери точности" ...
(Разумеется простеньким "треугольником Серпинского" там не обойтись но способов построить фрактал существует достаточно много )
Изображение
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Лекс Айрин » 05.08.2017 09:35:40

Alex2013 писал(а):Если сделать иначе (пусть даже размер будет равен несжатому формату BMP или PNG )то эффект будет гораздо лучше .


А смысл?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4181
Зарегистрирован: 19.02.2013 16:54:51

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 06.08.2017 12:44:23

Смысл как раз в возможности получить увеличение .... а если сделать фрактал в "псевдо 3д континууме" где третье измерении не "глубина" а "изменение кадров во времени" там ТАКОЕ можно вытворять ...
Зы
Кстати стало мне интересно как получили найденный мной "букет фрактальных цветов"и наткнулся я на небольшой "шедевр от программирования "
(Между прочим написан на дельфи ... исходники прилагаются )
https://sourceforge.net/projects/apophysis7x/

А это уже я лично "на фракталил" ... " Всем борцам за дело сингулярности посвящается !" :D :wink: :idea:
"Чшерский кот снова улыбается ..."
ИзображениеИзображение
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Лекс Айрин » 07.08.2017 11:44:15

Alex2013, смысл фрактальной графики и есть в том чтобы используя минимум формул нарисовать картину. А если размер будет такой, что проще его сохранить в bmp, то смысл исчезает. Идеал это 1% и меньше от bmp
Пример идеала это любой организм, который из одной клетки вырастает в полноценную особь.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4181
Зарегистрирован: 19.02.2013 16:54:51

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 07.08.2017 19:34:59

Есть такой прием "избыточное кодирование" обычно причины его применения в предотвращении потерь ...
Но бывают случаи, когда например с камеры удобнее читать данные в формате RAW то есть вообще не только без сжатия но и с разным техническим мусором ...
Просто потому, что потом данные можно обработать не "экспресс алгоритмами " на слабеньком контролере камеры, а "в полный профиль" медленными но качественными методами .

Ну а если записывать "фрактально -темпоральное" описание некоторой части видео потока то можно не только получать больше данных с того же самого "списка кадров" но и неслабо экономить в размерах сохраняемых данных ...

Да, разумеется, сделать фрактально-темпоральное кодирование для меня пока сложновато будет но просто "темпоральное" можно попробовать. Как ? Да просто! Найти движение и отделить его от фона ... Что вроде автоматической генерации спрайтов . :idea: Разумеется нужно отслеживать изменения самих движущихся объектов их пресечения и каким-то образом научиться дорисовывать фон заслоняемый пришедшими в движение но ранее неподвижными объектами ...

Но способ кодирования видео фрагментов получится очень интересный и несущий в себе массу ДОПОЛНИТЕЛЬНОЙ информации и удобств для систем "технического зрения" и программ с технологиями дополненной реальности... (то есть фактически при просмотре "TVF-файлов" будет производится "2Д рендаринг" изображений .)
Вообще-то MP4 делает что-то похожее но до "спрайтов" там добраться довольно сложно + в основе лежит "квадратно-гнездовое " JPG - сжатие ...
Зы
Вот еще одни фрактал чисто "для вдохновения" в духе мксимы "Возможно все !" :idea:

ИзображениеИзображение

(Если не строил этот фрактал сам то не поверил бы что это не коллаж в фотожабе ... Но факт ! )
Последний раз редактировалось Alex2013 07.08.2017 20:48:47, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Лекс Айрин » 07.08.2017 20:33:13

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


Профессионалы всегда считывают в RAW

Alex2013 писал(а):Есть такой прием "избыточное кодирование" обычно причины его применения в предотвращении потерь ...


вся полезная информация в ДНК занимает не больше 5-10% (точную цифру не помню)... причем, это вместе с зип архивом))). Все остальное это абсолютно левая инфа, например, осколки вирусов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4181
Зарегистрирован: 19.02.2013 16:54:51

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Alex2013 » 07.08.2017 20:58:06

Лекс Айрин писал(а):
Alex2013 писал(а):Но бывают случаи, когда например с камеры удобнее читать данные в формате RAW то есть вообще не только без сжатия но и с разным техническим мусором ...


Профессионалы всегда считывают в RAW

Alex2013 писал(а):Есть такой прием "избыточное кодирование" обычно причины его применения в предотвращении потерь ...


вся полезная информация в ДНК занимает не больше 5-10% (точную цифру не помню)... причем, это вместе с зип архивом))). Все остальное это абсолютно левая инфа, например, осколки вирусов.

+зашита от ошибок копирования она же "код смерти" (теломераза) .... (На самом деле думаю фокус в том что в организме ВСЕГДА есть эталонные "стволовые клетки" а теломераза просто защита от массового "несанкционированного копирования " не из исходного " репозитория" и не там где нужно.... )
А еще всем известно что ДНК "двойная спираль" что тоже как бы намекает на избыточность...

Зы
Но вернусь к "своему барану" то то бишь к "Подзорной трубе" ...
Пробовал интересный способ получения контуров ...
Код: Выделить всё
function Set255(Clr: integer): integer;
asm
  MOV  EAX,Clr  // store value in EAX register (32-bit register)
  CMP  EAX,254  // compare it to 254
  JG   @SETHI   // if greater than 254 then go set to 255 (Max value)
  CMP  EAX,1    // if less than 255, compare to 1
  JL   @SETLO   // if less than 1 go set to 0 (Min value)
  RET           // otherwise it doesn't change, just exit
@SETHI:         // Set value to 255
  MOV  EAX,255  // Move 255 into the EAX register
  RET           // Exit (result value is the EAX register value)
@SETLO:         // Set value to 0
  MOV  EAX,0    // Move 0 into EAX register
end;            // Result is in EAX
type
  TRGBArray = array[0..32767] of TRGBTriple;
  PRGBArray = ^TRGBArray;

procedure ConvolveE(Ray: array of integer; Z: word; var aBmp: TBitmap);

var
  O,T,C,B: pRGBArray;  // Scanlines
  x,y: integer;
  tBufr: TBitmap; // temp bitmap for 'enlarged' image
begin
  tBufr:=TBitmap.Create;
  tBufr.PixelFormat:=pf24bit;
  tBufr.SetSize(aBmp.Width+2,aBmp.Height+2); // Add a box around the outside...

  tBufr.BeginUpdate(False);
   O:=tBufr.ScanLine[0];   // Copy top corner pixels
   T:=aBmp.ScanLine[0];
   O[0]:=T[0];  // Left
   O[tBufr.Width-1]:=T[aBmp.Width-1];  // Right
  tBufr.EndUpdate(False);
  // Copy top lines
  tBufr.Canvas.CopyRect(Rect(1,0,tBufr.Width-1,1),aBmp.Canvas,Rect(0,0,aBmp.Width,1));
  tBufr.BeginUpdate(False);
   O:=tBufr.ScanLine[tBufr.Height-1]; // Copy bottom corner pixels
   T:=aBmp.ScanLine[aBmp.Height-1];
   O[0]:=T[0];
   O[tBufr.Width-1]:=T[aBmp.Width-1];
  tBufr.EndUpdate(False);
  // Copy bottoms
  tBufr.Canvas.CopyRect(RECT(1,tBufr.Height-1,tBufr.Width - 1,tBufr.Height),
         aBmp.Canvas,RECT(0,aBmp.Height-1,aBmp.Width,aBmp.Height));
  // Copy rights
  tBufr.Canvas.CopyRect(RECT(tBufr.Width-1,1,tBufr.Width,tBufr.Height-1),
         aBmp.Canvas,RECT(aBmp.Width-1,0,aBmp.Width,aBmp.Height));
  // Copy lefts
  tBufr.Canvas.CopyRect(RECT(0,1,1,tBufr.Height-1),
         aBmp.Canvas,RECT(0,0,1,aBmp.Height));
  // Now copy main rectangle
  tBufr.Canvas.CopyRect(RECT(1,1,tBufr.Width - 1,tBufr.Height - 1),
    aBmp.Canvas,RECT(0,0,aBmp.Width,aBmp.Height));
  // bmp now enlarged and copied, apply convolve
  for x:=0 to aBmp.Height - 1 do begin  // Walk scanlines
       aBmp.BeginUpdate(False);
    O:=aBmp.ScanLine[x];      // New Target (Original)
    T:=tBufr.ScanLine[x];     //old x-1  (Top)
    C:=tBufr.ScanLine[x+1];   //old x    (Center)
    B:=tBufr.ScanLine[x+2];   //old x+1  (Bottom)
  // Now do the main piece
    for y:=1 to (tBufr.Width - 2) do begin  // Walk pixels
      O[y-1].rgbtRed:=Set255(
          ((T[y-1].rgbtRed*ray[0]) +
          (T[y].rgbtRed*ray[1])+(T[y+1].rgbtRed*ray[2]) +
          (C[y-1].rgbtRed*ray[3]) +
          (C[y].rgbtRed*ray[4])+(C[y+1].rgbtRed*ray[5])+
          (B[y-1].rgbtRed*ray[6]) +
          (B[y].rgbtRed*ray[7])+(B[y+1].rgbtRed*ray[8])) div z
          );
      O[y-1].rgbtBlue:=Set255(
          ((T[y-1].rgbtBlue*ray[0]) +
          (T[y].rgbtBlue*ray[1])+(T[y+1].rgbtBlue*ray[2]) +
          (C[y-1].rgbtBlue*ray[3]) +
          (C[y].rgbtBlue*ray[4])+(C[y+1].rgbtBlue*ray[5])+
          (B[y-1].rgbtBlue*ray[6]) +
          (B[y].rgbtBlue*ray[7])+(B[y+1].rgbtBlue*ray[8])) div z
          );
      O[y-1].rgbtGreen:=Set255(
          ((T[y-1].rgbtGreen*ray[0]) +
          (T[y].rgbtGreen*ray[1])+(T[y+1].rgbtGreen*ray[2]) +
          (C[y-1].rgbtGreen*ray[3]) +
          (C[y].rgbtGreen*ray[4])+(C[y+1].rgbtGreen*ray[5])+
          (B[y-1].rgbtGreen*ray[6]) +
          (B[y].rgbtGreen*ray[7])+(B[y+1].rgbtGreen*ray[8])) div z
          );
    end;
    aBmp.EndUpdate(False);
  end;
  tBufr.Free;

end;
procedure CopyMe(var ToBMP,FromBMP: TBitmap);
begin
  ToBMP.Assign(FromBMP);
end;
{The Ignore (basic) version of a 3 x 3 convolution.

The 3 x 3 convolve uses the eight surrounding pixels as part of the
calculation.  But, for the pixels on the edges, there is nothing to use
for the top row values.  In other words, the leftmost pixel in the 3rd
row, or scanline, has no pixels on its left to use in the calculations.
This version just ignores the outermost edge of the image, and doesn't
alter those pixels at all.  Repeated applications of filters will
eventually cause a pronounced 'border' effect, as those pixels never
change but all others do. However, this version is simpler, and the
logic is easier to follow.  It's the fastest of the three in this
application, and works great if the 'borders' are not an issue. }

procedure ConvolveI(Ray: array of integer; Z: word; var aBmp: TBitmap);
var
  O,T,C,B: pRGBArray;  // Scanlines
  x,y: integer;
  tBufr: TBitmap; // temp bitmap
begin
  tBufr:=TBitmap.Create;
  tBufr.PixelFormat:=pf24bit;
  //tBufr.SetSize(aBmp.Width+2,aBmp.Height+2); // Add a box around the outside...
//  tBufr:=NewBitmap(0,0);
  CopyMe(tBufr,aBmp);
  for x:=1 to aBmp.Height-2 do begin  // Walk scanlines
   aBmp.BeginUpdate(False);
    O:=aBmp.ScanLine[x];      // New Target (Original)
    T:=tBufr.ScanLine[x-1];     //old x-1  (Top)
    C:=tBufr.ScanLine[x];   //old x    (Center)
    B:=tBufr.ScanLine[x+1];   //old x+1  (Bottom)
  // Now do the main piece
    for y:=1 to (tBufr.Width-2) do begin  // Walk pixels
      O[y].rgbtRed:=Set255(
          ((T[y-1].rgbtRed*ray[0])+
          (T[y].rgbtRed*ray[1])+(T[y+1].rgbtRed*ray[2])+
          (C[y-1].rgbtRed*ray[3])+
          (C[y].rgbtRed*ray[4])+(C[y+1].rgbtRed*ray[5])+
          (B[y-1].rgbtRed*ray[6])+
          (B[y].rgbtRed*ray[7])+(B[y+1].rgbtRed*ray[8])) div z);
      O[y].rgbtBlue:=Set255(
          ((T[y-1].rgbtBlue*ray[0])+
          (T[y].rgbtBlue*ray[1])+(T[y+1].rgbtBlue*ray[2])+
          (C[y-1].rgbtBlue*ray[3])+
          (C[y].rgbtBlue*ray[4])+(C[y+1].rgbtBlue*ray[5])+
          (B[y-1].rgbtBlue*ray[6])+
          (B[y].rgbtBlue*ray[7])+(B[y+1].rgbtBlue*ray[8])) div z);
      O[y].rgbtGreen:=Set255(
          ((T[y-1].rgbtGreen*ray[0])+
          (T[y].rgbtGreen*ray[1])+(T[y+1].rgbtGreen*ray[2])+
          (C[y-1].rgbtGreen*ray[3])+
          (C[y].rgbtGreen*ray[4])+(C[y+1].rgbtGreen*ray[5])+
          (B[y-1].rgbtGreen*ray[6])+
          (B[y].rgbtGreen*ray[7])+(B[y+1].rgbtGreen*ray[8])) div z);
    end;
  aBmp.EndUpdate(False);
  end;
  tBufr.Free;
end;
{The mirror version of a 3 x 3 convolution.

The 3 x 3 convolve uses the eight surrounding pixels as part of the
calculation.  But, for the pixels on the edges, there is nothing to use
for the top row values.  In other words, the leftmost pixel in the 3rd
row, or scanline, has no pixels on its left to use in the calculations.
I compensate for this by increasing the size of the bitmap by one pixel
on top, left, bottom, and right.  The mirror version is used in an
application that creates seamless tiles, so I copy the opposite sides to
maintain the seamless integrity.  }
procedure ConvolveM(Ray: array of integer; Z: word; var aBmp: TBitmap);
var
  O,T,C,B: pRGBArray;  // Scanlines
  x,y: integer;
  tBufr: TBitmap; // temp bitmap for 'enlarged' image
begin
//  tBufr:=NewBitmap(aBmp.Width+2,aBmp.Height+2);  // Add a box around the outside...
tBufr:=TBitmap.Create;
tBufr.PixelFormat:=pf24bit;
tBufr.SetSize(aBmp.Width+2,aBmp.Height+2); // Add a box around the outside...
tBufr.BeginUpdate(False);
  O:=tBufr.ScanLine[0];   // Copy top corner pixels
  T:=aBmp.ScanLine[0];
  O[0]:=T[0];  // Left
  O[tBufr.Width-1]:=T[aBmp.Width-1];  // Right
tBufr.EndUpdate(False);
  // Copy bottom line to our top - trying to remain seamless...
  tBufr.Canvas.CopyRect(Rect(1,0,tBufr.Width-1,1),aBmp.Canvas,Rect(0,aBmp.Height-1,aBmp.Width,aBmp.Height-2));
  tBufr.BeginUpdate(False);
  O:=tBufr.ScanLine[tBufr.Height-1]; // Copy bottom corner pixels
  T:=aBmp.ScanLine[aBmp.Height-1];
  O[0]:=T[0];
  O[tBufr.Width-1]:=T[aBmp.Width-1];
tBufr.EndUpdate(False);
  // Copy top line to our bottom
  tBufr.Canvas.CopyRect(Rect(1,tBufr.Height-1,tBufr.Width-1,tBufr.Height),aBmp.Canvas,Rect(0,0,aBmp.Width,1));
  // Copy left to our right
  tBufr.Canvas.CopyRect(RECT(tBufr.Width-1,1,tBufr.Width,tBufr.Height-1),
         aBmp.Canvas,RECT(0,0,1,aBmp.Height));
  // Copy right to our left
  tBufr.Canvas.CopyRect(RECT(0,1,1,tBufr.Height-1),
         aBmp.Canvas,RECT(aBmp.Width - 1,0,aBmp.Width,aBmp.Height));
  // Now copy main rectangle
  tBufr.Canvas.CopyRect(RECT(1,1,tBufr.Width - 1,tBufr.Height - 1),
    aBmp.Canvas,RECT(0,0,aBmp.Width,aBmp.Height));
  // bmp now enlarged and copied, apply convolve
  for x:=0 to aBmp.Height-1 do begin  // Walk scanlines
    aBmp.BeginUpdate(False);
    O:=aBmp.ScanLine[x];      // New Target (Original)
    T:=tBufr.ScanLine[x];     //old x-1  (Top)
    C:=tBufr.ScanLine[x+1];   //old x    (Center)
    B:=tBufr.ScanLine[x+2];   //old x+1  (Bottom)
  // Now do the main piece
    for y:=1 to (tBufr.Width-2) do begin  // Walk pixels
      O[y-1].rgbtRed:=Set255(
          ((T[y-1].rgbtRed*ray[0])+
          (T[y].rgbtRed*ray[1])+(T[y+1].rgbtRed*ray[2])+
          (C[y-1].rgbtRed*ray[3]) +
          (C[y].rgbtRed*ray[4])+(C[y+1].rgbtRed*ray[5])+
          (B[y-1].rgbtRed*ray[6]) +
          (B[y].rgbtRed*ray[7])+(B[y+1].rgbtRed*ray[8])) div z
          );
      O[y-1].rgbtBlue:=Set255(
          ((T[y-1].rgbtBlue*ray[0])+
          (T[y].rgbtBlue*ray[1])+(T[y+1].rgbtBlue*ray[2])+
          (C[y-1].rgbtBlue*ray[3]) +
          (C[y].rgbtBlue*ray[4])+(C[y+1].rgbtBlue*ray[5])+
          (B[y-1].rgbtBlue*ray[6]) +
          (B[y].rgbtBlue*ray[7])+(B[y+1].rgbtBlue*ray[8])) div z
          );
      O[y-1].rgbtGreen:=Set255(
          ((T[y-1].rgbtGreen*ray[0])+
          (T[y].rgbtGreen*ray[1])+(T[y+1].rgbtGreen*ray[2])+
          (C[y-1].rgbtGreen*ray[3]) +
          (C[y].rgbtGreen*ray[4])+(C[y+1].rgbtGreen*ray[5])+
          (B[y-1].rgbtGreen*ray[6]) +
          (B[y].rgbtGreen*ray[7])+(B[y+1].rgbtGreen*ray[8])) div z
          );
    end;
    aBmp.EndUpdate(False);
  end;
  tBufr.Free;
end;

procedure ConvolveFilter(var Src: TBitmap; Filternr,Edgenr: integer);
var
  z: integer;
  ray: array [0..8] of integer;
  OrigBMP: TBitmap;              // Bitmap for temporary use
begin
  z:=1;  // just to avoid compiler warnings!
  case filternr of
    0: begin // Laplace
      ray[0]:=-1; ray[1]:=-1; ray[2]:=-1;
      ray[3]:=-1; ray[4]:=8; ray[5]:=-1;
      ray[6]:=-1; ray[7]:=-1; ray[8]:=-1;
      z:=1;
      end;
    1: begin  // Hipass
      ray[0]:=-1; ray[1]:=-1; ray[2]:=-1;
      ray[3]:=-1; ray[4]:=9; ray[5]:=-1;
      ray[6]:=-1; ray[7]:=-1; ray[8]:=-1;
      z:=1;
      end;
    2: begin  // Find Edges (top down)
      ray[0]:=1; ray[1]:=1; ray[2]:=1;
      ray[3]:=1; ray[4]:=-2; ray[5]:=1;
      ray[6]:=-1; ray[7]:=-1; ray[8]:=-1;
      z:=1;
      end;
    3: begin  // Sharpen
      ray[0]:=-1; ray[1]:=-1; ray[2]:=-1;
      ray[3]:=-1; ray[4]:=16; ray[5]:=-1;
      ray[6]:=-1; ray[7]:=-1; ray[8]:=-1;
      z:=8;
      end;
    4 : begin  // Edge Enhance
      ray[0]:=0; ray[1]:=-1; ray[2]:=0;
      ray[3]:=-1; ray[4]:=5; ray[5]:=-1;
      ray[6]:=0; ray[7]:=-1; ray[8]:=0;
      z:=1;
      end;
    5: begin  // Color Emboss (Sorta)
      ray[0]:=1; ray[1]:=0; ray[2]:=1;
      ray[3]:=0; ray[4]:=0; ray[5]:=0;
      ray[6]:=1; ray[7]:=0; ray[8]:=-2;
      z:=1;
      end;
    6: begin  // Soften
      ray[0]:=2; ray[1]:=2; ray[2]:=2;
      ray[3]:=2; ray[4]:=0; ray[5]:=2;
      ray[6]:=2; ray[7]:=2; ray[8]:=2;
      z:=16;
      end;
    7 : begin  // Blur
      ray[0]:=3; ray[1]:=3; ray[2]:=3;
      ray[3]:=3; ray[4]:=8; ray[5]:=3;
      ray[6]:=3; ray[7]:=3; ray[8]:=3;
      z:=32;
      end;
    8: begin  // Soften less
      ray[0]:=0; ray[1]:=1; ray[2]:=0;
      ray[3]:=1; ray[4]:=2; ray[5]:=1;
      ray[6]:=0; ray[7]:=1; ray[8]:=0;
      z:=6;
      end;
    else exit;
  end;
  OrigBMP:=TBitmap.Create;
  //NewBitmap(0,0);  // Copy image to 24-bit bitmap
  CopyMe(OrigBMP,Src);

  case Edgenr of
    0: ConvolveM(ray,z,OrigBMP);
    1: ConvolveE(ray,z,OrigBMP);
    2: ConvolveI(ray,z,OrigBMP);
  end;
  Src.Assign(OrigBMP);  //  Assign filtered image to Image1
  OrigBMP.Free;
end;


Думал после его применения будет лучше работать датчик движения ...
Увы оказалось это не для моего доморощенного алгоритма . (Или ни какой разницы ли даже хуже... из за более темного изображения и как не странно большей разницы между кадрами. )
Но метод волне рабочий возможно нужно включить сглаживание при его применении но до него я еще не добрался ..
Последний раз редактировалось Alex2013 07.08.2017 23:31:05, всего редактировалось 4 раз(а).
Alex2013
энтузиаст
 
Сообщения: 710
Зарегистрирован: 03.04.2013 11:59:44

Re: Исследовательский проект "Цифровая оптика" .

Сообщение Лекс Айрин » 07.08.2017 21:17:55

Вообще, в организме много защитных механизмов. Начиная от двойного дублирования информации по типу RAID-10 (кстати, избыточной))) ) до уничтожения поврежденных клеток целиком (лейкоцитами). При этом, еще и часть органов продублирована, да и мозг имеет резервы восстановления. В общем, если бы так делали аппаратуру, то она была бы почти вечной. Даже возможность создания дополнительной личности и блокирования вредоносной информации есть.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4181
Зарегистрирован: 19.02.2013 16:54:51

След.

Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru