Этот пример показывает, как реализовать ограниченный контрастом алгоритм адаптивной гистограммы эквализации (CLAHE) с использованием блоков Simulink ®. Пример модели совместим с оборудованием FPGA.
В примере используется adapthisteq
функция из Image Processing Toolbox™ как ссылка для проверки проекта.
Адаптивная гистограмма эквализации (AHE) является методом предварительной обработки изображений, используемым для улучшения контрастности изображений. Он вычисляет несколько гистограмм, каждая из которых соответствует отдельному разделу изображения, и использует их, чтобы перераспределить значения яркости изображения. Поэтому он подходит для улучшения локальной контрастности и улучшения определений ребер в каждой области изображения. Однако AHE имеет тенденцию к избыточному усилению шума в относительно однородных областях изображения. Вариант адаптивной гистограммы эквализации, называемый контрастно-ограниченной адаптивной гистограммой эквализации (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 для настройки. Скорректированные значения пикселей отдаются блоку Pixels To Frame и преобразуются в систему координат с помощью управляющих сигналов. Подсистема Результата показывает входу изображение и выходное изображение, когда все пиксели в систему координат были получены блоком Pixels To Frame.
system = 'CLAHEExample/CLAHEHDLAlgorithm/tileGeneration'; open_system(system,'force');
Рисунок показывает подсистему генерации плитки. Изображение входа разделено на 8 плиток как в горизонтальном, так и в вертикальном направлениях. Плитки создаются путем изменения входа pixelcontrol
шина для выбора пикселей в каждой области мозаики. Подсистема VerticalTileExtractor извлекает плитки в вертикальном направлении. Размер вертикальной плитки вычисляется путем деления количества строк в вход изображении на количество плиток в вертикальном направлении (8 в этом примере). Эта вертикальная плитка предоставляется блоку ROI Selector, чтобы сгенерировать 8 горизонтальных плиток и их соответствующие pixelcontrol
шины. Размер горизонтальных плиток вычисляется путем деления количества столбцов на количество плиток в горизонтальном направлении (8 в этом примере). Потоком пикселей в трубопровод эквализации гистограммы управляют, отводя каждую вертикальную плитку в альтернативную трубу. Размер плитки, рассчитанный в, должен быть четным целым числом. Если вход изображение не делится на целое число мозаик четного размера, дополните вход изображение симметрично.
system = 'CLAHEExample/CLAHEHDLAlgorithm/histoEqPipeline/'; subsystem = [system 'histPipe1']; open_system(subsystem,'force');
Два трубопровода эквализации гистограммы используются, чтобы идти в ногу с потоковыми входными пикселями. Каждый трубопровод эквализации гистограммы состоит из 8 модулей эквализации гистограммы, соответствующих каждой плитке в горизонтальном направлении. Эти модули реализуются с помощью подсистемы For Each. Каждый модуль эквализации гистограммы разделен на пять этапов: вычисление гистограммы, вычисление общего избытка, общее избыточное распределение, избыточное перераспределение, совокупная функция распределения и отображение.
Первый модуль трубопровода гистограмм, подсистема histoExcess, выполняет вычисление гистограммы и вычисление общего избытка для каждой плитки. Для вычисления гистограммы используется блок Histogram. Когда гистограмма завершена, блок генерирует сигнал readRdy. Затем подсистема считывает значения гистограммы и определяет избыточное значение из каждого интервала при помощи предельного значения клипа. Предел клипа вычисляется из нормированного предельного значения клипа, заданного с помощью этих уравнений.
Избыточное значение из каждого интервала накапливается для формирования общего избыточного значения. Ранее вычисленные значения гистограммы не изменяются во время вычисления общего избытка и сохраняются в блоке оперативной памяти простого двойного порта. Необходимые сигналы управления для блока RAM (ramBus) генерируются подсистемой histoExcess. Общее избыточное значение, вычисленное в подсистеме histoExcess, используется подсистемой Distribute.
Подсистема Distribute вычисляет две переменные: средний шаг интервала и верхний предел. Эти значения вычисляются из общего избыточного значения при помощи этих уравнений:
Затем подсистема Distribute считывает значение каждого интервала гистограммы из блока RAM. Оно обновляет значение в каждом интервале на основе этих трех условий:
Если значение гистограммы интервала больше предела клипа, он заменяется пределом клипа.
Если значение гистограммы интервала между пределом зажима и верхним пределом, значение гистограммы заменяется пределом зажима. Общее избыточное значение уменьшается на количество добавленных пикселей, равное (clipLimit - histVal)
.
Если значение гистограммы интервала меньше верхнего предела, значение гистограммы увеличивается на средний шаг интервала. Общее избыточное значение уменьшается на средний шаг интервала.
Скорректированное значение гистограммы сохранено по тому же адресу. Оставшееся общее избыточное значение передается Подсистеме Перераспределения как избыточное значение.
system = 'CLAHEExample/CLAHEHDLAlgorithm/histoEqPipeline/'; subsystem = [system 'histPipe1/redistribute']; open_system(subsystem,'force');
Подсистема Redistribute распределяет избыточные значения разлива по интервалам гистограммы. Он в основном использует две переменные, чтобы распределить избыточные значения: binIncr и шаг. binIncr задает значение, которое будет добавлено в интервалы гистограммы. шаг задает шаг в счетчике адресов, используемый для выборки значения интервала гистограммы. Если избыток больше или равен количеству интервалов, то binIncr вычисляется путем деления избыточного значения на количество интервалов, и шаг устанавливается равным 1. Деление реализовано с помощью операции правого сдвига, поскольку количество интервалов представляет собой степень 2.
Если избыток меньше, чем количество интервалов, binIncr устанавливается равным 1, и шаг вычисляется путем деления количества интервалов на избыточное значение. Деление вычисляется с помощью блока n-D Интерполяционная таблица (Simulink). The redistributeCtrl
Функция MATLAB генерирует адрес для блока оперативной памяти, используя вычисленное значение шага. Когда адрес достигает общего количества интервалов, значение шага повторно вычисляется с использованием самого последнего избыточного значения. Рекомендуется не повторять первый интервал в качестве начального интервала для перераспределения. Если значение интервала гистограммы меньше предела клипа, оно увеличивается на binIncr, и это же значение вычитается из избыточного значения. Если значение интервала гистограммы равно пределу клипа, операция не выполняется, и значение записывается обратно на тот же адрес. Блок MATLAB Function повторяет эти регулировки интервала до тех пор, пока избыточное значение не достигнет 0.
Последняя ступень трубопровода эквализации гистограммы - расчет CDF. Подсистема CDF вычисляет совокупную сумму значений интервала гистограммы. Значения гистограммы считываются из блока RAM и добавляются к сумме предыдущих значений интервала гистограммы. Затем он сохраняется по тому же адресу.
Пять каскадов модуля гистограммы эквализации могут быть рассмотрены как пять состояний. Пять состояний модуля гистограммы эквализации являются последовательными. Таким образом, счетчик состояний используется для перехода от одного состояния к другому состоянию. Значение счетчика определяет состояние модуля эквализации гистограммы. Блок Multiport Switch (Simulink) используется со счетчиком состояний в качестве значения индекса. Мультипортовый коммутатор соединяет ramBus из каждого состояния с правильной памятью в соответствии с индексом. Счетчик состояний находится в состоянии 1 в условии ожидания. Когда histoExcess завершает вычисление избытка, он устанавливает готовый сигнал равным 1 для одного цикла, и счетчик состояний переходит в состояние 2. Аналогично, подсистема распределения, подсистема перераспределения и подсистема cdf генерируют завершенные флаги при завершении их обработки. Эти завершенные флаги увеличивают счетчик состояния до состояния 5, где он использует пиксельные значения входного изображения из блока буфера входного изображения в качестве адресов для чтения значений CDF из ОЗУ. Счетчик адресов, который читает значения входного изображения, управляется подсистемой билинейной интерполяции. Счетчик состояний приращивается подсистемой билинейной интерполяции, когда отображение для соответствующего конвейера завершено.
Билинейная интерполяция используется для сглаживания ребер, когда плитки сшиваются вместе. Рисунок показывает, как четыре плитки используются для вычисления значений пикселей в выходном изображении. Каждая плитка разделена на четыре части. Одна часть из каждого из четырех плиток сгруппирована вместе, чтобы вычислить билинейную интерполяцию для этого раздела изображения.
Интерполяция использует это уравнение:
Уравнение билинейной интерполяции использует положение пикселя относительно каждого плитки и информацию о интенсивности в этом положении, чтобы вычислить значение пикселя в выходном изображении. Информацию об интенсивности получают из значений пикселей входного изображения, сохраненных в буфере изображений. Для угловых плиток значения интенсивности реплицируются (зеркалируются). Информация о интенсивности в соответствующем положении в каждой плитке извлекается из функции CDF трубопровода эквализации гистограммы при помощи значения входа изображения в том же положении. The grayxform
функция масштабирует значения, полученные из функции CDF. Результат затем делится на количество пикселей в плитке, представленное как normFactor в уравнении.
system = 'CLAHEExample/CLAHEHDLAlgorithm/bilinearInterpolation'; open_system(system,'force');
Рисунок показывает реализацию HDL подсистемы билинейной интерполяции. Когда трубопровод эквализации гистограммы достигает состояния 5, подсистема paramCalc начинает вычислять адрес чтения для подсистемы imgBuffer. Значение пикселя, считанное из буферизованного изображения, является адресом для ОЗУ в трубопроводе эквализации гистограммы. Значения CDF выбираются из адреса чтения для всех плиток из обоих трубопроводов эквализации гистограммы одновременно. Необходимые значения CDF выбираются и передаются в подсистему уравнений с помощью блоков Selector Switch и блоков Switch. Блок Switch выбирает, какой трубопровод содержит верхние/нижние плитки, а блоки Selector Switch выбирают данные, соответствующие левым/правым плиткам. Сигналы управления для блоков Selector Switch и Switch генерируются в подсистеме paramCalc с помощью счетчика чтения. Таким образом, значения интенсивности в пиксельном положении для каждого плитки получают из буфера изображений. Билинейное уравнение интерполяции также требует положения пикселя и общего количества пикселей в плитке. Эти параметры также генерируются в подсистеме paramCalc. Подсистема уравнений конвейеризована, чтобы оптимизировать эффективность в оборудовании. Результат возвращается как поток пикселей с pixelcontrol
шина.
Билинейная интерполяция выходного изображения вычисляется путем прохождения строк слева направо. Когда все модули гистограммы эквализации в первом трубопроводе достигли состояния 5, подсистема paramCalc активируется. Адреса чтения для подсистемы imgBuffer вычисляются до точки А. Дальнейшие расчеты билинейной интерполяции требуют значений из модулей гистограммы эквализации второго конвейера. Когда все модули гистограммы эквализации во втором конвейере достигли состояния 5, счетчик адресов чтения снова активируется, и выходные результаты билинейной интерполяции вычисляются для пиксельных положений между точкой A и точкой B. Когда счетчик адресов достигает точки B, результаты из первого конвейера больше не требуются. The 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 и имеет ошибку 1 пиксель.
HDL-код может быть сгенерирован для подсистемы CLAHEHDL. Для генерации HDL-кода требуется HDL- Coder™ лицензия. Этот проект была синтезируем на платформе Intel ® Arria ® 10 GX для 10AX115S2F45I1SG устройства FPGA. Таблица показывает использование ресурсов. HDL- проекта достигает тактовой частоты более 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.