Реализация FPGA контрастной ограниченной адаптивной эквализации гистограммы

В этом примере показано, как реализовать алгоритм ограниченной контрастом адаптивной эквализации гистограммы (CLAHE) с помощью блоков Simulink. Это использует adapthisteq функция от Image Processing Toolbox™ как ссылка. Модель в качестве примера аппаратно-совместима FPGA, и может обеспечить производительность в реальном времени.

Введение

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

Алгоритм CLAHE

Алгоритм CLAHE имеет три больших части: генерация мозаики, эквализация гистограммы и билинейная интерполяция. Входное изображение сначала разделено на разделы. Каждый раздел называется мозаикой. Входное показанное на рисунке изображение разделено на четыре мозаики. Эквализация гистограммы затем выполняется на каждой мозаике с помощью предопределенного предела клипа. Эквализация гистограммы состоит из пяти шагов: расчет гистограммы, избыточное вычисление, избыточное распределение, избыточное перераспределение, и масштабирование и отображение использования кумулятивной функции распределения (CDF). Гистограмма вычисляется как набор интервалов для каждой мозаики. Значения интервала гистограммы выше, чем предел клипа накапливаются и распределяются в другие интервалы. CDF затем вычисляется для значений гистограммы. Значения CDF каждой мозаики масштабируются и сопоставили использование входных значений пикселя изображения. Получившиеся мозаики сшиты вместе с помощью билинейной интерполяции, чтобы сгенерировать выходное изображение с улучшенным контрастом.

Реализация HDL

Этот рисунок показывает блок-схему реализации HDL алгоритма CLAHE. Это состоит из блока генерации мозаики, конвейерного блока эквализации гистограммы, блока билинейной интерполяции и входного буферного блока изображений. Мозаики сгенерированы путем изменения pixelcontrol шина пиксельного потока для желаемого размера мозаики. Пиксельный поток и модифицированный pixelcontrol шина питается конвейер эквализации гистограммы. Два конвейера эквализации гистограммы требуются, чтобы идти в ногу с входными данными. Они действуют способом пинг-понга. Каждый конвейер содержит модули эквализации гистограммы, равные количеству мозаик в горизонтальном направлении. Модули эквализации гистограммы работают параллельно, чтобы вычислить эквализацию гистограммы для каждой мозаики. Последней стадии в модуле эквализации гистограммы, масштабируясь и сопоставляя, нужны исходные входные данные изображения. Эти данные хранятся во входном буферном блоке изображений. Блок билинейной интерполяции генерирует адреса, чтобы считать входные значения пикселя изображения из памяти. Входные значения пикселя изображения от буферного блока изображений даны модулям эквализации гистограммы для отображения. Сопоставленные значения, полученные из эквализации гистограммы, масштабируются и используются в расчете билинейной интерполяции, чтобы уменьшать граничные артефакты.

modelname = 'CLAHEExample';
open_system(modelname,'force');
set_param(modelname,'SampleTimeColors','off');
set_param(modelname,'Open','on');
set_param(modelname,'SimulationCommand','Update');
set(allchild(0),'Visible','off');

Рисунок показывает представление верхнего уровня CLAHEExample модель. Входной канал передачи изображения задан в блоке inputImage. Входной фрейм изображения преобразован в пиксельный поток и pixelcontrol шина с помощью блока Frame To Pixels. Пиксельный поток передается подсистеме CLAHEHDLAlgorithm для контрастного улучшения и также хранится в imgBuffer подсистеме. При обработке подсистема CLAHEHDLAlgorithm генерирует адрес, чтобы считать данные изображения из imgBuffer подсистемы. Пиксельное значение, считанное из imgBuffer подсистемы, передается CLAHEHDLAlgorithm для корректировки. Настроенные пиксельные значения даны блоку Pixels To Frame и преобразованы в систему координат с помощью управляющих сигналов. Подсистема Результата показывает входное изображение и выходное изображение, если все пиксели в системе координат были получены блоком Pixels To Frame.

Генерация мозаики

system = 'CLAHEExample/CLAHEHDLAlgorithm/tileGeneration';
open_system(system,'force');

Рисунок показывает подсистему генерации мозаики. Входное изображение разделено на 8 мозаик и в горизонтальных и в вертикальных направлениях. Мозаики создаются путем изменения входа pixelcontrol соедините шиной, чтобы выбрать пиксели в каждой области мозаики. Подсистема VerticalTileExtractor извлекает мозаики в вертикальном направлении. Размер вертикальной мозаики вычисляется путем деления количества строк во входном изображении количеством мозаик в вертикальном направлении (8 в этом примере). Эта вертикальная мозаика дана блоку Селектора ROI, чтобы сгенерировать 8 горизонтальных мозаик и их соответствующий pixelcontrol шины. Размер горизонтальных мозаик вычисляется путем деления количества столбцов количеством мозаик в горизонтальном направлении (8 в этом примере). Пиксельным потоком к конвейеру эквализации гистограммы управляют путем отклонения каждой вертикальной мозаики к альтернативному трубопроводу. Размер мозаики, вычисленный в любом, должен быть ровным целым числом. Если входное изображение не делится на целое число мозаик ровного размера, заполните входное изображение симметрично.

Конвейер эквализации гистограммы

system = 'CLAHEExample/CLAHEHDLAlgorithm/histoEqPipeline/';
subsystem = [system 'histPipe1'];
open_system(subsystem,'force');

Два конвейера эквализации гистограммы используются, чтобы идти в ногу с входными пикселями потоковой передачи. Каждый конвейер эквализации гистограммы состоит из 8 модулей эквализации гистограммы, соответствующих каждой мозаике в горизонтальном направлении. Эти модули реализованы при помощи Для Каждой подсистемы. Каждый модуль эквализации гистограммы разделен на пять этапов: вычисление гистограммы, общее избыточное вычисление, общее избыточное распределение, избыточное перераспределение, кумулятивная функция распределения и отображение.

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

$$minClipLimit = ceil(numPixInTile/numBins);$$

$$clipLimit = minClipLimit + round(normClipLimit*(numPixInTile-minClipLimit));$$

Избыточное значение от каждого интервала накапливается, чтобы сформировать общее избыточное значение. Ранее вычисленные значения гистограммы не изменяются во время общего избыточного вычисления и хранятся в Простом Двухпортовом блоке Оперативной памяти. Необходимые управляющие сигналы для блока RAM (ramBus) сгенерированы гистоизбыточной подсистемой. Общее избыточное значение, вычисленное в гистоизбыточной подсистеме, используется Распределить подсистемой.

Распределить подсистема вычисляет две переменные: средний шаг интервала и верхний предел. Эти значения вычисляются из общего избыточного значения при помощи этих уравнений:

$$avgBinIncr = totalExcess/numBins;$$

$$upperLimit = clipLimit - avgBinIncr;$$

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

  1. Если значение гистограммы интервала больше предела клипа, оно заменяется пределом клипа.

  2. Если значение гистограммы интервала между пределом клипа и верхним пределом, значение гистограммы заменяется пределом клипа. Общее избыточное значение уменьшается количеством добавленных пикселей, равных (clipLimit - histVal).

  3. Если значение гистограммы интервала меньше верхнего предела, значение гистограммы увеличено средним шагом интервала. Общее избыточное значение уменьшается средним шагом интервала.

Настроенное значение гистограммы хранится в том же адресе. Остающееся общее избыточное значение передается Перераспределять подсистеме как избыточное значение.

system = 'CLAHEExample/CLAHEHDLAlgorithm/histoEqPipeline/';
subsystem = [system 'histPipe1/redistribute'];
open_system(subsystem,'force');

Перераспределять подсистема распределяет значения избытка избытка интервалам гистограммы. Это, в основном, использует две переменные, чтобы распределить избыточные значения: binIncr и шаг. binIncr задает значение, которое будет добавлено к интервалам гистограммы. шаг указывает, что шаг в счетчике адреса раньше выбирал значение интервала гистограммы. Если избыток больше или равен количеству интервалов, то binIncr вычисляется путем деления избыточного значения количеством интервалов, и шаг установлен в 1. Деление реализовано при помощи операции сдвига вправо, поскольку количество интервалов является степенью 2.

Если избыток меньше количества интервалов, binIncr установлен в 1, и шаг вычисляется путем деления количества интервалов избыточным значением. Деление вычисляется при помощи n-D блока Lookup Table. redistributeCtrl Функция MATLAB генерирует адрес для блока RAM при помощи вычисленного значения шага. Когда адрес достигает общего количества интервалов, значение шага повторно вычисляется с помощью нового избыточного значения. Заботу соблюдают, чтобы не повторить первый интервал как интервал запуска для перераспределения. Если значение интервала гистограммы меньше предела клипа, это увеличено на binIncr, и то же значение вычтено из избыточного значения. Если значение интервала гистограммы равно пределу клипа, никакая операция не выполняется, и значение записывается обратно к тому же адресу. Блок MATLAB function повторяет эти корректировки интервала, пока избыточное значение не достигает 0.

Последняя стадия конвейера эквализации гистограммы является вычислением CDF. Подсистема CDF вычисляет совокупную сумму значений интервала гистограммы. Значения гистограммы читаются из блока RAM и добавляются к сумме предыдущих значений интервала гистограммы. Это затем хранится к тому же адресу.

Пять этапов модуля эквализации гистограммы могут быть рассмотрены как пять состояний. Пять состояний модуля эквализации гистограммы последовательны. Таким образом счетчик состояния используется, чтобы переместиться от одного состояния до другого состояния. Встречное значение определяет состояние модуля эквализации гистограммы. Многопортовый блок switch используется со счетчиком состояния в качестве значения индекса. Многопортовый переключатель соединяет ramBus от каждого состояния с правильной памятью согласно индексу. Счетчик состояния находится в состоянии 1 в неактивном условии. Когда гистоизбыток закончил избыточное вычисление, это устанавливает сделанный сигнал на 1 для одного цикла, и счетчик состояния перемещается, чтобы утвердить 2. Точно так же распределить подсистема, перераспределите подсистему, и cdf подсистема генерирует сделанные флаги, когда их обработка завершается. Эти сделанные флаги постепенно увеличивают состояние в противоречии с состоянием 5, где это использует входные значения пикселя изображения от входного буферного блока изображений как адреса, чтобы считать значения CDF из RAM. Счетчик адреса, который читает входные значения изображений, управляется подсистемой билинейной интерполяции. Счетчик состояния постепенно увеличивается подсистемой билинейной интерполяции, когда отображение для соответствующего конвейера завершено.

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

Билинейная интерполяция используется, чтобы сглаживать ребра, когда мозаики сшиты вместе. Рисунок показывает, как четыре мозаики являются использованными для расчета пиксельными значениями в выходном изображении. Каждая мозаика разделена на четыре части. Одна часть от каждой из этих четырех мозаик группируется, чтобы вычислить билинейную интерполяцию для того раздела изображения.

Интерполяция использует это уравнение:

$$grayxform(imgPixVals,mapTile) = round(255*mapTile(imgPixVals)/
numPixInTile);$$

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

system = 'CLAHEExample/CLAHEHDLAlgorithm/bilinearInterpolation';
open_system(system,'force');

Рисунок показывает реализацию HDL подсистемы билинейной интерполяции. Когда конвейер эквализации гистограммы достигает состояния 5, paramCalc подсистема начинает вычислять адрес чтения для imgBuffer подсистемы. Пиксельное значение, считанное из буферизованного изображения, является адресом для RAM в конвейере эквализации гистограммы. Значения CDF выбираются от адреса чтения для всех мозаик от обоих конвейеры эквализации гистограммы одновременно. Необходимые значения CDF выбраны и переданы подсистеме уравнения с помощью блоков Селекторного переключателя и блоков switch. Блок switch выбирает, какой конвейер содержит верхние/ниже мозаики и данные о выборе блоков Селекторного переключателя, соответствующие слева/справа мозаикам. Управляющие сигналы для Селекторного переключателя и блоков switch сгенерированы в paramCalc подсистеме при помощи счетчика чтения. Таким образом значения интенсивности в положении пикселя для каждой мозаики получены из буфера изображений. Уравнение билинейной интерполяции также требует положения пикселя и общего количества пикселей в мозаике. Эти параметры также сгенерированы в paramCalc подсистеме. Подсистема уравнения является конвейерной, чтобы оптимизировать производительность в оборудовании. Результат возвращен как пиксельный поток с pixelcontrol шина.

Билинейная интерполяция выходного изображения вычисляется путем пересечения строк слева направо. Когда все модули эквализации гистограммы в первом конвейере достигли состояния 5, paramCalc подсистема включена. Адреса чтения для imgBuffer подсистемы вычисляются до точки A. Дальнейший расчет билинейной интерполяции требует значений от модулей эквализации гистограммы второго конвейера. Когда все модули эквализации гистограммы во втором конвейере достигли состояния 5, счетчик адреса чтения снова включен и билинейная интерполяция, выходные результаты вычисляются для положений пикселя между точкой A и точкой B. Если счетчик адреса достигает точки B, следует из первого конвейера, больше не требуются. pipe1Done сигнал сгенерирован, чтобы изменить состояние первых конвейерных модулей эквализации гистограммы назад, чтобы утвердить 1. До этой точки мозаики в первом конвейере являются верхними мозаиками, и мозаики во втором конвейере являются более низкими мозаиками. Для расчета значений между точкой B и точкой C, мозаики во втором конвейере становятся верхними мозаиками, и мозаики в первом конвейере являются теперь более низкими мозаиками. Эта операция продолжается, пока только самые низкие мозаики в изображении не остаются. Выход для этих мозаик вычисляется путем тиражирования значений для другого конвейера. Выходные результаты продвинуты в FIFO в outputStage подсистеме и высунуты таким образом, что выход допустимый сигнал похож на тот из потока входного пикселя.

Параметры модели

CLAHE использует предел клипа, чтобы предотвратить перенасыщение изображения в гомогенных областях. Эти области характеризуются высоким пиком в гистограмме мозаики изображений из-за многих пикселей, падающих в той же области значений интенсивности. Для модели, представленной здесь, предел клипа является пользовательским нормированным значением. Значение по умолчанию 0.01 (как показано в фигуре). Предел клипа может быть любым значением между 0 и 1 (включительно).

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

Этот пример использует входное изображение размера 240 320 пиксели, путь которых задан в блоке inputImage. Входные пиксели изображения заданы одним компонентом интенсивности в uint8 тип данных. Для 8 мозаик в каждом направлении вычисленный размер мозаики 30 40, и количество пикселей в каждой мозаике 1200. Номер интервалов гистограммы определяется к 256.

Этот рисунок показывает входное изображение и выходное изображение из модели CLAHE. Результат показывает улучшенный контраст в выходном изображении, без сверх - насыщение. Результат модели CLAHE HDL совпадает с adaphisteq функция в MATLAB и имеет ошибку$$ \pm $$ 1 пикселя.

HDL-код может быть сгенерирован для подсистемы CLAHEHDL. Лицензия HDL Coder™ требуется, чтобы генерировать HDL-код. Этот проект синтезировался на платформе Intel® Arria® 10 GX, для 10AX115S2F45I1SG устройство FPGA. Таблица показывает использование ресурса. Проект HDL достигает тактовой частоты более чем 120 МГц.

% ================================================
% |Model Name              ||      CLAHEHDL     ||
% ================================================
% |Input Image Resolution  ||     320 x 240     ||
% |ALM Utilization         ||       48527       ||
% |Total Registers         ||       52887       ||
% |Total RAM Blocks        ||        62         ||
% |Total DSP Blocks        ||        38         ||
% ================================================

Ссылки

Карел Цуидервельд, "Контрастная Ограниченная Адаптивная Эквализация Гистограммы", Графический IV Драгоценных камней, p. 474-485, код: p. 479-484.

Для просмотра документации необходимо авторизоваться на сайте