Цифровая коррекция аберрации объекта телекамеры

Для решения задач обнаружения препятствий и распознавания образов необходимо наличие неискаженного изображения. Однако большинство объективов телекамер обладают искажающим эффектом (аберрацией). Объективы, в которых полностью устранена аберрация, обладают высокой стоимостью и большими массогабаритными характеристиками.

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

Рассмотрим задачу коррекции аберрации. Чаще всего распространены объективы, в которых преобладает эффект отрицательной дисторсии (эффект "рыбьего глаза").

Рис.1. Принцип устранения дисторсии: а) Схематичное изображение экрана с нанесенными векторами смещения пикселей; б) График зависимости длины радиус-вектора (r1) пикселя после устранения дисторсии от его изначальной длины (r).

Для устранения отрицательной дисторсии необходимо программно реализовать эффект положительной дисторсии. Для этого необходимо преобразовать координаты каждого пикселя видеоизображения.

При пересчете координат каждый пиксель в координатах (i, j) результирующего изображения (i=[0;W-1]; j=[0;H-1]) должен принять цвет пикселя в координатах (xi, yi) исходного изображения. Здесь: W, H - длина и ширина изображения. При положительной дисторсии наблюдается косинусная зависимость длины радиус-вектора (r1) пикселя после коррекции от длины радиус-вектора (r) пикселя до коррекции (Рис. б). Эта особенность позволяет записать основные расчетные соотношения для пересчета координат.

Здесь:

W, H - длина и ширина изображения.

L - фактор коррекции, задается пользователем в процессе калибровки камеры (0L<1); при L=0 - коррекции не наблюдается; при L=1 - максимальный эффект положительной дисторсии.

h - полудиагональ экрана (Рис.1. а);

u, v - координаты радиус-вектора r пикселя, проведенного из центра экрана (Рис.1. а).

V - коэффициент коррекции или отношение r/r1 (Рис.1).

Получив основные расчетные соотношения, составим алгоритм коррекции.


Пусть видеоизображение представляется непрерывным массивом данных. Этот массив данных можно представить как в виде двухмерного массива HxW, так и в виде одномерного массива длиной H·W. В данном случае удобно рассматривать изображение в виде одномерного массива. Обозначим через Ei<0> яркость i-ого пикселя исходного видеоизображения, а через Ei<1> - яркость i-ого пикселя результирующего видеоизображения.

Алгоритм коррекции должен состоять из двух этапов:

  1. Этап предварительной подготовки, который выполняется перед началом основного программного цикла.
    На этом этапе необходимо составить специальную корректировочную таблицу M, которая представляет собой одномерный массив адресов памяти (указателей). Длина массива H·W. Каждый элемент массива с номером (i+j·W) соответствует пикселю в координатах (i, j) результирующего изображения. В этот элемент массива записывается смещение адреса пикселя (xi, yj) исходного изображения. Это смещение адреса вычисляется по формуле Mi+j·W=xi+yi·W. Здесь xi, yj - координаты пикселя, вычисленные по приведенным выше расчетным соотношениям.
  2. Этап непосредственной работы.
    На данном этапе необходимо организовать цикл от 0 до H·W-1, в котором каждому значению пикселя результирующего изображения необходимо присвоить значение пикселя согласно составленной таблице:



    Программная реализация алгоритма

    Программая реализация алгоритма коррекции аберрации объектива телекамеры представлена следующим примером. В нем имеется процедура подготовки матрицы коррекции M (CorrectMatrix), и непосредственно алгоритм исправления дисторсии черно-белого изображения Source в формате Grayscale8. После преобразования результат помещается в переменную Dest, представляющую изображение такого же формата.

    ...
    interface
    
    const
      ImageWidth  = 384;  // ширина изображения. Если умножить на 3 должно быть кратным 4
      ImageHeight = 284;  // высота изображения
    
    type
      { Матрица коррекции. Хранит смещения адресов пикселей
        относительно начала изображения }
      TCorrectMatrix = packed array[0..ImageHeight-1,0..ImageWidth-1] of Integer;
    
      // тип данных для черно-белого изображения
      TBWImage    = array[0..ImageHeight-1,0..ImageWidth-1] of Byte;
    
    
    type
      TForm1 = class(TForm)
        Panel1 : TPanel;
        PaintBox1 : TPaintBox;
        Timer1 : TTimer;
        ...
        public
          BWImage       : TBWImage;
          BWImage2	    : TBWImage;
          CorrectMatrix : TCorrectMatrix;
      end;
    ...
    
    implementation
    
    
    
    
    {---------------------------------------------------}
    {     Процедура создает матрицу коррекции           }
    {     L - фактор коррекции, устававливается         }
    {     экспериментально в диапазоне от 0.1 до 0.9    }
    {---------------------------------------------------}
    procedure CreateCorrectMatrix(L : Single; var Matrix : TCorrectMatrix);
    var
      x,y,u,v,Ofs : Integer;
      r,r1    : Single;
      RR,DD,Diag : Single;
    begin
      Diag:=sqrt(sqr(ImageWidth/2) + sqr(ImageHeight/2));
      RR:=Diag/L;
      DD:=RR*RR - Diag*Diag;
    
      for y:=0 to ImageHeight-1 do
      for x:=0 to ImageWidth-1 do
      begin
        u:=x-ImageWidth div 2;
        v:=y-ImageHeight div 2;
        r:=u*u + v*v;
        if r>0 then
        begin
          r1:=sqrt(DD/(DD + r));
    
          u:=round(u*r1)+ImageWidth div 2;
          v:=round(v*r1)+ImageHeight div 2;
    
          if u>ImageWidth-1 then u:=ImageWidth-1
          else
          if u<0 then u:=0;
    
          if v>ImageHeight-1 then v:=ImageHeight-1
          else
          if v<0 then v:=0;
        end
        else
        begin
          u:=x; v:=y;
        end;
        Ofs:=v*ImageWidth + u;
    
        Matrix[y,x]:=Ofs;
      end;
    end;
    
    
    
    {---------------------------------------------------}
    {     Процедура производит коррекцию изображения,   }
    {          используя созданную матрицу              }
    {---------------------------------------------------}
    procedure CorrectImage(const Source:TBWImage; var Dest:TBWImage; const Matrix:TCorrectMatrix); assembler;
    asm
    	  // EAX-Source; EDX-Dest; ECX-Matrix          
    	  PUSH   EDI
              PUSH   ESI
              PUSH   EBX
    
              MOV    EBX,EAX
              MOV    EDI,EDX
              MOV    ESI,ECX
    
              MOV    ECX,ImageWidth*ImageHeight
    
    @@1:      LODSD
              MOV    AL,[EBX+EAX]
              STOSB
              LOOP   @@1
    
              POP    EBX
              POP    ESI
              POP    EDI
    end;
    
    
    
    procedure TForm1.FormCreate(Sender:TObject);
    begin
      ...
      // Создаем матрицу коррекции
      CreateCorrectMatrix( 0.563, CorrectMatrix );  
    end;
      
    
    procedure TForm1.Timer1Timer(Sender:TObject);
    begin
      { Получить изображение черно-белое изображение BWImage }
    
      // Коррекция изображения BWImage, результат - в BWImage2
      CorrectImage(BWImage,BWImage2,CorrectMatrix);
    
      // Вывести изображение BWImage2 на PaintBox1 см. захват изображения
      DrawBWImage( PaintBox1.Canvas.Handle, BWImage2 );
      
      ...
    end;
    
    end.
    
    

    Экспериментальные исследования алгоритма коррекции аберрации

    Проведем эксперименты по применению алгоритма коррекции аберрации (искажения) объектива телекамеры.

    Целью этих экспериментов является установление фактора коррекции L, а также показать эффективность разработанного алгоритма.

    Экспериментально установлен фактор коррекции L=0.563. При этом факторе коррекции прямые грани объектов, положенных перед телекамерой отображаются прямыми линиями на изображении (Рис.2).

    Рис.2. Экспериментальные исследования алгоритма устранения дисторсии объектива телекамеры: а) изображение с телекамеры; б) изображение после цифрового устранения дисторсии.



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

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