Строим гистограммы изображений в Delphi и C#

altЗдравствуйте, сегодня я научу вас как строить гистограммы изображения. Сначала я думал написать тестовый пример на Delphi, но потом решил что покажу пример не только на Delphi, но и на C#.


Решил уделить внимание этой теме т.к. в интернете не достаточно информации и новичку в обработке изображений может быть сложнова-то.

Немного теории…

Для начала разберёмся, чтоже такое гистограмма. Гистогрмма (в фотографии) — это график распределения полутонов изображения, в котором по горизонтальной оси представлена уровень тона канала или яркость, а по вертикали — относительное число пикселей с данным значением. Гистограммы зачастую являются очень важными данными при обработке изображений.

От теории к практике…

Итак, почитав описание гистограммы изображения, перед нами сразу вычерчивается алгоритм её построения.

Создать пустой массив целых чисел на 256 элементов
Просматриваем попиксельно изображение
У каждого пикселя берём информацию о нужном цветовом канале
Увеличиваем на единицу значение в массиве под индексом величины цветового канала
Вот, собственно, и весь алгоритм. Достаточно простой, на уровне первого курса университета.

Реализуем в C#…

Для реализации вышеописанного алгоритма, основываясь на принципах ООП, я написал класс Histogram, который полностью делает вышеописанное (исходный код будет приведён в конце статьи вместе с тестовым приложением).

Пример использования:

Только кодкопировать в буфер обменапечать
Histogramm hRed = new Histogramm(pictureBox1.Image, 0);
hRed.DrawHistogramm(ref pictureBox2);
В первой строчке мы создаём объект Histogram, выполняем анализ изображения и заполнение массива.
Во второй строчке мы выводим гистограмму в PictureBox.

Результат работы тестового приложения (C#):

Реализуем в Delphi…

Для реализации в Delphi я решил пойти по томуже пути что и в C#. Был реализован класс THistogram который по своему функционалу идентичен предыдущему (исходный код будет приведён в конце статьи вместе с тестовым приложением).

Пример использования:

Только кодкопировать в буфер обменапечать
hRed:=THistogram.Create(img1,0);
hRed.DrawHistogram(img2);
В первой строчке мы создаём объект THistogram, выполняем анализ изображения и заполнение массива.
Во второй строчке мы выводим гистограмму в TImage.

Сравним два приложения…

Кроме всего прочего, я, также, решил провести сравнение скорости построения диаграмм двумя примерами (условия равные, изображения одинаковые, время загрузки изображения не учитывается).

Время замерялось в мс (миллисекундах) при помощи следующих средств:

Delphi: функция GetTickCount.
C#: свойство Ticks класса DateTime.
Результат выводился на форму в компонент Label.

Для тестов было выбрано 7 фотографий разного разрешения. Для каждой фотографии проводилось 10 замеров каждым примером. Результаты были сохранены в виде таблицы и графиков и будут приведены ниже.

Выводы…

Как видите, ничего сложного в построении гистограмм изображения нет, но вот пользы от них очень много. Результаты сравнения меня, мягко говоря, ОЧЕНЬ удивили. Я конечно предполагал что Delphi будет выигрывать по скорости, но не думал что он окажется настолько быстрее.

Понравилась статья? Поделиться с друзьями: