Вращайте изображение небольшим острым углом

В этом примере показано, как реализовать алгоритм поворота изображения для небольших острых углов для FPGA.

Поворот изображения является перемещением изображения вокруг фиксированной точки. Это - одно из наиболее распространенных смежных преобразований и является основным принципом многих приложений компьютерного зрения как извлечение признаков и соответствие. Это уравнение представляет смежное преобразование, которое вращает новые координаты$(x,y)$ от исходных координат$(u,v)$ попеременно угол$\theta$.

$$ \left[{\begin{array}{cc} x\\y \end{array}}\right] = \left[{\begin{array}{ccc} cos(\theta) & -sin(\theta)\\ sin(\theta)& cos(\theta) \\ \end{array} }\right] \left[{\begin{array}{cc} u\\v \end{array}} \right] $$

Эта реализация основана на imrotate (Image Processing Toolbox) функция.

Этот пример вычисляет матрицу преобразования для угла в области значений (–10, 0) и (0, 10) при помощи ComputeSmallAngleAffineTransform.m функция. Матрица преобразования, возвращенная этой функцией, является входом к аппаратному алгоритму. Аппаратный алгоритм выполняет смежное преобразование и вычисляет интенсивность выходного пикселя при помощи билинейной интерполяции. Эта реализация не требует внешней памяти DDR и вместо этого использует блок RAM на чипе, чтобы сохранить и передискретизировать интенсивность выходного пикселя.

Алгоритм поворота изображения

Алгоритм поворота изображения использует противоположный метод отображения, чтобы сопоставить пиксельные местоположения вращаемого изображения выхода к пикселям во входном изображении. Эта схема показывает различные этапы алгоритма.

Вычислите Преобразование, Этот этап вычисляет параметры преобразования с помощью входных размеров изображения и угла вращения$\theta$. Параметры преобразования, что этот этап выходные параметры включает выходные границы и матрицу преобразования$tForm$. Границы помогают вычислить целочисленные пиксельные координаты выхода, вращал изображение и$tForm$ преобразовывает целочисленные пиксельные координаты во вращаемое изображение выхода к соответствующим координатам входного изображения.

Смежное преобразование смежное преобразование является геометрическим преобразованием, которое переводит точку в одной плоскости изображения на другую плоскость изображения путем сохранения коллинеарности изображений. Коллинеарность означает, что все точки на линии во входном изображении все еще формируют ту линию после преобразования. Поворот изображения, целочисленные пиксельные координаты карт во вращаемом изображении выхода к соответствующим координатам входного изображения при помощи матрицы преобразования$tForm$. Если$(u,v)$ целочисленная пиксельная координата во вращаемом выходном изображении и$(x,y)$ соответствующая координата входного изображения, то это уравнение описывает преобразование.

$$[x \hspace{0.2cm} y \hspace{0.2cm} z]_{1X3} = [u \hspace{0.2cm} v
\hspace{0.2cm} 1]_{1X3} * tForm^{-1}_{3X3}$$

Билинейная интерполяция алгоритм вращения может произвести$(x,y)$ координаты, которые являются значениями нецелого числа. Чтобы сгенерировать интенсивность пикселей в каждом целочисленном положении, метод передискретизации как интерполяция должен использоваться. Этот пример использует билинейную интерполяцию, чтобы передискретизировать значения интенсивности изображений, соответствующие сгенерированным координатам.

В уравнении и схеме,$(x,y)$ координата входного пикселя, сгенерированного этапом смежного преобразования.$I1$$I2$, $I3$и$I4$ четыре соседних пикселя, и$deltaX$ и$deltaY$ смещения целевого пикселя от его соседних пикселей. Этот этап алгоритма вычисляет взвешенное среднее четырех соседних пикселей при помощи этого уравнения.

$$outputPixel=I1(1-deltaX)(1-deltaY)+I2(deltaX)(1-deltaY)+I3(1-deltaX)(deltaY)+I4(deltaX)(deltaY)$$

Реализация HDL

Этот рисунок показывает представление верхнего уровня ImageRotationHDL модель. Блок InputImage импортирует изображение из файлов. Блок Frame To Pixels преобразует входные фреймы изображения в пиксельный поток с pixelcontrol соедините шиной для входа к ImageRotationHDLALgorithm подсистема. Эта подсистема вращает входное изображение углом, который можно задать при помощи маски блока Transform. Блок Pixels To Frame преобразует поток выходных пикселей назад к системам координат. ImageViewer подсистема отображает входной кадр и соответствующий вращаемый выход.

open_system('ImageRotationHDL');
set(allchild(0),'Visible','off');

InitFcn коллбэк модели в качестве примера вычисляет$tForm$ путем вызова ComputeSmallAngleAffineTransform.m функция. Эта функция берет угол вращения и входных размеров изображения как вход. Можно установить эти значения в маске блока Transform. В качестве альтернативы можно сгенерировать собственную матрицу преобразования (сглаженный к 6 1 вектору, потому что последний столбец$tForm$ избыточен), и дайте его как вход к ImageRotationHDLAlgorithm подсистема.

В ImageRotationHDLAlgorithm подсистема, GenerateControl подсистема генерирует управляющий сигнал pixelcontrol соедините шиной от входа ctrl шину в зависимости от параметра смещения. CoordinateGeneration подсистема генерирует пиксельные координаты строки и столбца$(u,v)$ вращаемого изображения выхода. Это использует два счетчика HDL, чтобы сгенерировать координаты строки и столбца. AffineTransform подсистема сопоставляет эти координаты на их соответствующие координаты строки и столбца $(x,y)$входного изображения.

AddressGeneration подсистема вычисляет адреса четырех соседей$(x,y)$ необходимых для интерполяции. Эта подсистема также вычисляет параметры$deltaX$$deltaY$, $Bound$и$indexVector$, которые используются для билинейной интерполяции.

Interpolation подсистема хранит интенсивности пикселей входного изображения в памяти. Чтобы вычислить каждую вращаемую интенсивность выходного пикселя, подсистема читает четыре соседних пиксельных значения и вычисляет их взвешенную сумму.

open_system('ImageRotationHDL/ImageRotationHDLAlgorithm','force');

Аффинное преобразование

Реализация HDL аффинного преобразования умножает координаты [u v 1] с матрицей преобразования,$tForm$ (сглаженный к 6 1 вектору, потому что последний столбец$tForm$ избыточен). ComputeSmallAngleAffineTransform.m функция, вызванная в InitFcn коллбэк модели, генерирует$tForm$ матрицу. Transformation подсистема реализует умножение матриц с блоками продукта, которые умножают целочисленные координаты выходного изображения каждым элементом$tForm$ матрицы. Для этой операции,$tForm$ разделен от вектора в отдельные элементы при помощи блока Demux.

open_system('ImageRotationHDL/ImageRotationHDLAlgorithm/AffineTransform','force');

Генерация адресов

AddressGeneration подсистема берет сопоставленную координату входного изображения сырых данных$(x,y)$, как введено и затем вычисляет смещение$deltaX$ и$deltaY$ каждого пикселя от его соседних пикселей. Подсистема также округляет координаты до ближайшего целого числа к отрицательной бесконечности.

open_system('ImageRotationHDL/ImageRotationHDLAlgorithm/AddressGeneration','force');

AddressCalculation подсистема проверяет координаты по границам входных изображений. Если какая-либо координата находится вне размеров изображения, та координата ограничивается к граничному значению для последующей обработки. Затем подсистема вычисляет индекс адреса каждого из четырех пикселей окружения в блоке CacheMemory. Индекс представляет столбец кэша. Подсистема находит индекс для каждого адреса при помощи четной и нечетной природы входящего столбца и координат строки, как определено блоком Extract Bits.

% ==========================
% |Row  || Col  || Index ||
% ==========================
% |Odd  || Odd  ||   1   ||
% |Even || Odd  ||   2   ||
% |Odd  || Even ||   3   ||
% |Even || Even ||   4   ||
% ==========================

Адрес пикселей окружения сгенерирован с помощью этого уравнения.

$$Address = (\frac{SizeOfColumn}{2}*nR)+nC$$

$nR$ координата строки и$nC$ координата столбца. Когда$row$ является четным, затем$nR=\frac{row}{2}-1$. Когда$row$ является нечетным, затем$nR=\frac{row-1}{2}$. Когда$col$ является четным, затем$nC=\frac{col}{2}$. Когда$col$ является нечетным, затем$nC=\frac{col+1}{2}$.

Блок MATLAB function IndexChangeForMemoryAccess в AddressCalculation подсистема перестраивает адреса в увеличивающемся порядке их индексов. Эта операция гарантирует правильную выборку данных из блока CacheMemory. Адреса даны как вход с блоком CacheMemory, и$index$$deltaX$, и$deltaY$ передаются Interpolation подсистема.

OutOfBound подсистема проверяет, выходят ли$(x,y)$ координаты за пределы (то есть, если любая координата находится вне размеров изображения). Если координата выходит за пределы, соответствующий выходной пиксель установлен в значение интенсивности 0.

После того, как все адреса и их соответствующие индексы сгенерированы, блок Vector Concatenate создает векторы из адресов и индексов.

Интерполяция

Interpolation подсистема является блоком For Each, который реплицирует его операцию в зависимости от размерностей входного пикселя. Например, если вход является изображением RGB, то размерности входного пикселя 1 3, и модель включает 3 экземпляра этой операции. Используя For Each блок позволяет модели поддержать вход RGB или полутоновый вход. Операция в Для Каждой подсистемы включает две подсистемы: BilinearInterpolation и CacheMemory.

open_system('ImageRotationHDL/ImageRotationHDLAlgorithm/Interpolation','force');

Кэш-память

CacheMemory подсистема содержит блок Simple Dual Port RAM. Подсистема буферизует входные пиксели, чтобы сформировать [Line 1 Pixel 1 | Line 2 Pixel 1 | Line 1 Pixel 2 | Line 2 Pixel 2] в RAM. Эта настройка позволяет алгоритму считать все четыре соседних пикселя в одном цикле. Необходимый размер кэш-памяти вычисляется от смещения выход ComputeSmallAngleAffineTransform.m функция. Смещение является суммой максимального отклонения и первой карты строки. Первая карта строки является максимальным значением входной координаты строки изображений, которая соответствует первой строке вращаемого изображения выхода. Максимальное отклонение является самым большим различием между максимальными и минимальными координатами строки для каждой строки входной карты строки изображений.

WriteControl подсистема формирует векторы входящих пикселей, разрешений записи и адресов записи. AddressGeneration подсистема обеспечивает вектор из адресов чтения. Вектор пикселей, которые читаются из RAM, становится входом к BilinearInterpolation подсистема.

open_system('ImageRotationHDL/ImageRotationHDLAlgorithm/Interpolation/CacheMemory','force');

Билинейная интерполяция

BilinearInterpolation подсистема перестраивает вектор пикселей чтения от кэша до их исходных индексов. Затем BilinearInterpolationEquation подсистема вычисляет взвешенную сумму пикселей окружения при помощи уравнения билинейной интерполяции, упомянутого в разделе Image Rotation Algorithm. Результатом интерполяции является значение вращаемого пикселя выхода.

open_system('ImageRotationHDL/ImageRotationHDLAlgorithm/Interpolation/BilinearInterpolation','force');

Симуляция и результаты

Этот пример использует изображение входа RGB на 480 пунктов. Входные пиксели используют uint8 тип данных. Пример поддерживает или шкалу полутонов или изображения входа RGB. Этот пример поддерживает острые углы в области значений (–10, 0) и (0, 10). Углы, больше, чем 10 градусов, требуют намного более высоких ресурсов BRAM.

Этот рисунок показывает входное изображение и соответствующее выходное изображение, вращаемое углом 7 градусов. Результаты ImageRotationHDL модель для этого входа совпадает с выходом imrotate функция.

Проверять и сгенерировать HDL-код сослались в этом примере, у вас должен быть продукт HDL Coder™.

Чтобы сгенерировать HDL-код, введите эту команду.

makehdl('ImageRotationHDL/ImageRotationHDLAlgorithm')

Чтобы сгенерировать испытательный стенд, введите эту команду.

makehdltb('ImageRotationHDL/ImageRotationHDLAlgorithm')

Этот проект синтезировался с помощью Xilinx® Vivado® для устройства ZC706 и удовлетворил требование синхронизации более чем 200 МГц. Эта таблица показывает использование ресурса для подсистемы HDL.

% ===============================================================
% |Model Name              ||        ImageRotationHDL      ||
% ===============================================================
% |Input Image Resolution  ||         480 x 640            ||
% |LUT                     ||           2238               ||
% |FF                      ||           2570               ||
% |BRAM                    ||            96                ||
% |Total DSP Blocks        ||            94                ||
% ===============================================================