Версия:
Аннотация
Растровое изображение. Пиксели. Сглаживание.
В данной заметке будет показано как обрабатывать растровые изображения. В первом подразделе как по-пиксельно обрабатывать изображение.
Как было указано в прошлой заметке растровое изображение представляется в виде матрицы. Матрица хранится в памяти построчно, т.е. строчка за строчкой. Последние означает, что данные одной строчки идут вслед за данными предыдущей. Данные каждой строчки соответствуют пикселям её составляющие, при этом каналы хранятся последовательно для каждого из пикселей.
В согласии с вышеописанным представим простейшую программу, которая создает негатив по изображению, т.е. значение каждого из каналов заменяется на "противоположный а именно – вычитается из значения . Сначала покажем как это можно осуществить на чистом Си, далее будем видоизменять программу, в том числе, совершенствовать.
Си-шный способ Обход всех пикселов в общем случае технически сложен так как необходимо учитывать тип элементов матрицы. Рассмотрим случай, когда он является беззнаковым 8-битным целым числом (CV_8U).
С точки зрения эффективности память лучше обходить последовательно (связано с устройством кэша), поэтому строчки матрицы как это и показано в программе лучше обходить построчно.
Ввиду того, что каналы в памяти идут подряд, как и сами пикселы, в случае идентичной операции для всех каналов можно избавится от внутреннего цикла:
Подчеркну, что это возможно только в том случае, елси все каналы обрабатываются единообразно. В противном случае, пришлось бы как ранее и было показано все-таки каждый из пикселов обрабатывать по отдельности.
Эффективность можно поднять ещё больше, если учитывать расположение строк. Так, существует метод Mat::isContinuous(), который позволяет определить идут ли строчку в притык одна к другой. Если да, то матрицу можно обрабатывать как одномерный массив:
Итератор из C++ Для обхода всех пикселов можно воспользоваться итератором.
Напрямую У класса Mat есть метод Mat::at, который позволяет получить доступ к произвольному элементу матрицы.
или в случае 3х компонентной матрицы
Упражнения Упражнение. В прошлой заметке было показано как изменить контраст (умножению на константу) и яркость (добавление серого) фактически благодаря операциям над матрицами. Все тоже самое можно сделать написав цикл. Напишите его в качестве тренировки. Подсказка: значения нужно "насыщать"(saturate_cast<uchar>).
Как ранее было показано изображения считываются функцией imread. Для считывания видео нужно использовать класс VideoCapture.
В конструкторе указывается путь к картинке.