Фильтрация изображения

Фильтрация производится окном, размером 3x3 пикселя. Фильтр находит среднее значение всех 9 точек, и результат записывается в центральную точку окна. Окно пробегается по всему изображению. Затем процесс фильтрации повторяется ровно столько раз, каков порядок данного фильтра. Рекомендуется использовать фильтр 3-4-его порядка.

Процесс фильтрации можно ускорить примерно в два раза, если находить среднее значение не 9, а 8 точек окна, исключив одну из угловых точек. В этом случае деление суммы яркостей нужно будет производить не на 9, а на 8, что можно заменить операцией правого сдвига на 3, которая на процессорах intel80x86 выполняется в ~8 раз быстрее.

...
interface

const
  ImageWidth  = 384;  // ширина изображения. Если умножить на 3 должно быть кратным 4
  ImageHeight = 284;  // высота изображения

type
  // тип данных для черно-белого изображения
  TBWImage    = array[0..ImageHeight-1,0..ImageWidth-1] of Byte;

...
type
  TForm1 = class(TForm)
    Panel1 : TPanel;
    PaintBox1 : TPaintBox;
    Timer1 : TTimer;
    ...
    public
      BWImage    : TBWImage;
  end;
...

implementation

...


{ процедура фильтрует указанное изображение }
procedure FilterBWImage(var Image : TBWImage); assembler;
asm
         PUSH    EDI
         MOV     EDI,EAX
         ADD     EDI,1+ImageWidth
         MOV     ECX,ImageHeight-2

@@1:     PUSH    ECX
         PUSH    EDI

         MOV     ECX,ImageWidth-2

@@2:     XOR     EAX,EAX
         MOV     AL,[EDI-ImageWidth-1]
         ADD     AL,[EDI-ImageWidth]
         ADC     AH,0
         ADD     AL,[EDI-ImageWidth+1]
         ADC     AH,0
         ADD     AL,[EDI-1]
         ADC     AH,0
         ADD     AL,[EDI]
         ADC     AH,0
         ADD     AL,[EDI+1]
         ADC     AH,0
         ADD     AL,[EDI+ImageWidth-1]
         ADC     AH,0
         ADD     AL,[EDI+ImageWidth]
         ADC     AH,0
         SHR     EAX,3
         STOSB

         LOOP    @@2
         POP     EDI
         POP     ECX
         ADD     EDI,ImageWidth
         LOOP    @@1

         POP     EDI
end;


procedure TForm1.Timer1Timer(Sender:TObject);
begin
  { Получить черно-белое изображение в BWImage }

  // Фильтрация изображения 3 раза
  FilterBWImage(BWImage);
  FilterBWImage(BWImage);
  FilterBWImage(BWImage);	

  // Вывести результирующее изображение на PaintBox1. см. Захват видео.
  DrawBWImage( PaintBox1.Canvas.Handle, BWImage );
  
  ...
end;

end.




Назад ]
Дизайн: DynSoft 

Рейтинг@Mail.ru
Используются технологии uCoz