exponenta event banner

Коррекция адаптивной гистограммы с ограниченным контрастом

В этом примере показано, как реализовать алгоритм коррекции адаптивной гистограммы с ограничением контрастности (CLAHE) с использованием блоков Simulink ®. Примерная модель совместима с FPGA-оборудованием.

В примере используется adapthisteq функция из Toolbox™ обработки изображений в качестве ссылки для проверки конструкции.

Введение

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

Алгоритм CLAHE

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

Внедрение ЛПВП

На этом рисунке показана блок-схема реализации 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 для корректировки. Скорректированные значения пикселей задаются блоку «Пиксели в кадр» и преобразуются в кадр с использованием управляющих сигналов. Подсистема Result отображает входное изображение и выходное изображение после того, как все пиксели в кадре были приняты блоком Pixels To Frame.

Создание плитки

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

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

Конвейер выравнивания гистограммы

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

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

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

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

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

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

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

$$avgBinIncr = totalExcess/numBins;$$

$$upperLimit = clipLimit - avgBinIncr;$$

Затем подсистема Distribute считывает значение каждого ячейки гистограммы из блока ОЗУ. Она обновляет значение на каждом складском месте на основе следующих трех условий:

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

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

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

Скорректированное значение гистограммы сохраняется по тому же адресу. Оставшееся общее избыточное значение передается в подсистему перераспределения как избыточное значение.

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

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

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

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

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

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

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

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

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

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

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

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

Билинейная интерполяция выходного изображения вычисляется путем прохождения строк слева направо. Когда все модули выравнивания гистограммы в первом конвейере достигли состояния 5, подсистема paramCalc включается. Адреса считывания для подсистемы imgBuffer вычисляются до точки А. Для дальнейшего вычисления билинейной интерполяции требуются значения из модулей выравнивания гистограммы второго конвейера. Когда все модули выравнивания гистограммы во втором конвейере достигли состояния 5, счетчик адреса считывания снова включается и выходные результаты билинейной интерполяции вычисляются для положений пикселей между точкой А и точкой В. Как только счетчик адреса достигает точки В, результаты из первого конвейера больше не требуются. pipe1Done формируют сигнал для изменения состояния модулей трубопровода выравнивания первой гистограммы обратно в состояние 1. До этого момента плитки в первом трубопроводе являются верхними плитками, а плитки во втором трубопроводе являются нижними плитками. Для вычисления значений между точкой В и точкой С плитки во втором трубопроводе становятся верхними плитками, а плитки в первом трубопроводе теперь являются нижними плитками. Эта операция продолжается до тех пор, пока не останутся только самые нижние элементы изображения. Выходные данные для этих фрагментов вычисляются путем репликации значений для другого конвейера. Выходные результаты перемещаются в 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 требуется лицензия HDL Coder™. Эта конструкция была синтезирована на платформе Intel ® Arria ® 10 GX для 10AX115S2F45I1SG устройства FPGA. В таблице показано использование ресурсов. Конструкция ЛПВП обеспечивает тактовую частоту более 120 МГц.

% ================================================
% |Model Name              ||      CLAHEHDL     ||
% ================================================
% |Input Image Resolution  ||     320 x 240     ||
% |ALM Utilization         ||       47814       ||
% |Total Registers         ||       53031       ||
% |Total RAM Blocks        ||        77         ||
% |Total DSP Blocks        ||        38         ||
% ================================================

Ссылки

Карел Цуйдервельд, «Контрастная ограниченная адаптивная гистограмма уравнивания», Графические самоцветы IV, с. 474-485, код: с. 479-484.