В этом примере показано, как реализовать алгоритм поворота изображения для небольших острых углов для FPGA.
Поворот изображения является перемещением изображения вокруг фиксированной точки. Это - одно из наиболее распространенных смежных преобразований и является основным принципом многих приложений компьютерного зрения как извлечение признаков и соответствие. Это уравнение представляет смежное преобразование, которое вращает новые координаты от исходных координат попеременно угол.
Эта реализация основана на imrotate
(Image Processing Toolbox) функция.
Этот пример вычисляет матрицу преобразования для угла в области значений (–10, 0) и (0, 10) при помощи ComputeSmallAngleAffineTransform.m
функция. Матрица преобразования, возвращенная этой функцией, является входом к аппаратному алгоритму. Аппаратный алгоритм выполняет смежное преобразование и вычисляет интенсивность выходного пикселя при помощи билинейной интерполяции. Эта реализация не требует внешней памяти DDR и вместо этого использует блок RAM на чипе, чтобы сохранить и передискретизировать интенсивность выходного пикселя.
Алгоритм поворота изображения использует противоположный метод отображения, чтобы сопоставить пиксельные местоположения вращаемого изображения выхода к пикселям во входном изображении. Эта схема показывает различные этапы алгоритма.
Вычислите Преобразование, Этот этап вычисляет параметры преобразования с помощью входных размеров изображения и угла вращения. Параметры преобразования, что этот этап выходные параметры включает выходные границы и матрицу преобразования. Границы помогают вычислить целочисленные пиксельные координаты выхода, вращал изображение и преобразовывает целочисленные пиксельные координаты во вращаемое изображение выхода к соответствующим координатам входного изображения.
Смежное преобразование смежное преобразование является геометрическим преобразованием, которое переводит точку в одной плоскости изображения на другую плоскость изображения путем сохранения коллинеарности изображений. Коллинеарность означает, что все точки на линии во входном изображении все еще формируют ту линию после преобразования. Поворот изображения, целочисленные пиксельные координаты карт во вращаемом изображении выхода к соответствующим координатам входного изображения при помощи матрицы преобразования. Если целочисленная пиксельная координата во вращаемом выходном изображении и соответствующая координата входного изображения, то это уравнение описывает преобразование.
Билинейная интерполяция алгоритм вращения может произвести координаты, которые являются значениями нецелого числа. Чтобы сгенерировать интенсивность пикселей в каждом целочисленном положении, метод передискретизации как интерполяция должен использоваться. Этот пример использует билинейную интерполяцию, чтобы передискретизировать значения интенсивности изображений, соответствующие сгенерированным координатам.
В уравнении и схеме, координата входного пикселя, сгенерированного этапом смежного преобразования., и четыре соседних пикселя, и и смещения целевого пикселя от его соседних пикселей. Этот этап алгоритма вычисляет взвешенное среднее четырех соседних пикселей при помощи этого уравнения.
Этот рисунок показывает представление верхнего уровня ImageRotationHDL
модель. Блок InputImage импортирует изображение из файлов. Блок Frame To Pixels преобразует входные фреймы изображения в пиксельный поток с pixelcontrol
соедините шиной для входа к ImageRotationHDLALgorithm
подсистема. Эта подсистема вращает входное изображение углом, который можно задать при помощи маски блока Transform. Блок Pixels To Frame преобразует поток выходных пикселей назад к системам координат. ImageViewer
подсистема отображает входной кадр и соответствующий вращаемый выход.
open_system('ImageRotationHDL'); set(allchild(0),'Visible','off');
InitFcn
коллбэк модели в качестве примера вычисляет путем вызова ComputeSmallAngleAffineTransform.m
функция. Эта функция берет угол вращения и входных размеров изображения как вход. Можно установить эти значения в маске блока Transform. В качестве альтернативы можно сгенерировать собственную матрицу преобразования (сглаженный к 6 1 вектору, потому что последний столбец избыточен), и дайте его как вход к ImageRotationHDLAlgorithm
подсистема.
В ImageRotationHDLAlgorithm
подсистема, GenerateControl
подсистема генерирует управляющий сигнал pixelcontrol
соедините шиной от входа ctrl шину в зависимости от параметра смещения. CoordinateGeneration
подсистема генерирует пиксельные координаты строки и столбца вращаемого изображения выхода. Это использует два счетчика HDL, чтобы сгенерировать координаты строки и столбца. AffineTransform
подсистема сопоставляет эти координаты на их соответствующие координаты строки и столбца входного изображения.
AddressGeneration
подсистема вычисляет адреса четырех соседей необходимых для интерполяции. Эта подсистема также вычисляет параметры, и, которые используются для билинейной интерполяции.
Interpolation
подсистема хранит интенсивности пикселей входного изображения в памяти. Чтобы вычислить каждую вращаемую интенсивность выходного пикселя, подсистема читает четыре соседних пиксельных значения и вычисляет их взвешенную сумму.
open_system('ImageRotationHDL/ImageRotationHDLAlgorithm','force');
Реализация HDL аффинного преобразования умножает координаты [u v 1] с матрицей преобразования, (сглаженный к 6 1 вектору, потому что последний столбец избыточен). ComputeSmallAngleAffineTransform.m
функция, вызванная в InitFcn
коллбэк модели, генерирует матрицу. Transformation
подсистема реализует умножение матриц с блоками продукта, которые умножают целочисленные координаты выходного изображения каждым элементом матрицы. Для этой операции, разделен от вектора в отдельные элементы при помощи блока Demux.
open_system('ImageRotationHDL/ImageRotationHDLAlgorithm/AffineTransform','force');
AddressGeneration
подсистема берет сопоставленную координату входного изображения сырых данных, как введено и затем вычисляет смещение и каждого пикселя от его соседних пикселей. Подсистема также округляет координаты до ближайшего целого числа к отрицательной бесконечности.
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 || % ==========================
Адрес пикселей окружения сгенерирован с помощью этого уравнения.
координата строки и координата столбца. Когда является четным, затем. Когда является нечетным, затем. Когда является четным, затем. Когда является нечетным, затем.
Блок MATLAB function IndexChangeForMemoryAccess в AddressCalculation
подсистема перестраивает адреса в увеличивающемся порядке их индексов. Эта операция гарантирует правильную выборку данных из блока CacheMemory. Адреса даны как вход с блоком CacheMemory, и, и передаются Interpolation
подсистема.
OutOfBound
подсистема проверяет, выходят ли координаты за пределы (то есть, если любая координата находится вне размеров изображения). Если координата выходит за пределы, соответствующий выходной пиксель установлен в значение интенсивности 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 || % ===============================================================