Выполнение морфологических операций
Морфологические операции изменяют интенсивность определенных областей изображения. В отличие от свертки или геометрических операций, влияющих на все изображение, морфологические операции изолируют определенные разделы изображения (подтверждающий их или как передний план или как фон), и затем расширяется или договоры просто те области для достижения желаемого эффекта.
Разработчики, ищущие эффективные способы улучшить или изолировать качества изображения, найденные или на переднем плане или на фоне изображения, сочтут морфологические операции в vImage полезными. Например, можно применить морфологические операции к научным изображениям ландшафта Марса для выполнения топологических исследований, изолирующих кратеры и долины вдоль поверхности планеты. В целом морфологические операции являются подходящими для:
Изоляция фоновых функций от приоритетных функций в изображении (и наоборот)
Выполнение выявления признаков
Выполнение планирования движения объекта вдоль поверхности с видимыми препятствиями
В этой главе описываются основы обработки изображений с помощью морфологии. Путем чтения этой главы Вы будете:
Посмотрите типы задач, которые могут выполнить морфологические операции
Изучите, как отличаются изображения и объекты, и как vImage работает на объекты
Узнайте через примеры кода, как применить морфологические операции к изображениям
Объекты
Цель vImage морфологических операций отличается от того из других типов операций, найденных в vImage. Вместо того, чтобы применить работу ко всему изображению, vImage применяет морфологические операции к объекту. Объект составлен или из самых ярких пикселей в изображении или из самых темных пикселей в изображении, где яркость определяется относительно определенного изображения.
Рисунок 4-1 показывает объекты, обрисованные в общих чертах в изображении.
Морфологические функции изменяют форму объекта путем выполнения расширения, эрозии, максимума и минимальных операций. Расширение разворачивает объекты. Эрозия заключает их. В то время как минимум является особым случаем эрозии, максимум является особым случаем расширения. Как со сверткой, точный характер расширения или уменьшения определяется ядром, которое обеспечивает функция вызова. Число строк и число столбцов изображения не изменяются после применения морфологической работы.
При определении ярких пикселей как объекта темные пиксели становятся фоном. В этом случае расширяется расширение, объекты с эрозией заключает их. При определении темных пикселей как объекта яркие пиксели становятся фоном. В этом случае объекты договоров расширения и эрозия разворачивают их.
Можно использовать морфологические функции на полутоновых изображениях, где исходное изображение планарное (одноканальный) или на полноцветных изображениях. Само ядро (объясненный более подробно в следующем разделе) является всегда планарным.
Ядра
Каждая морфологическая функция требует, чтобы Вы передали ее ядро свертки, определяющее, как значения соседних пикселей используются для вычислений значения целевого пикселя. Ядро является упакованным массивом, не дополняя в концах строк. См. также Ядра Свертки. Элементы массива должны иметь тип uint8_t
(для Planar8
и ARGB8888
форматы) или типа float
(для PlanarF
и ARGBFFFF
форматы). Высота и ширина массива должны оба быть нечетными числами.
Например, 3 x 3 ядра свертки для a Planar8
изображение состоит из массива девяти 8-разрядных (1-байтовых) значений, расположенных последовательно. Первые три значения представляют первую строку ядра, следующие три значения вторая строка и последние три значения третья строка.
Функции морфологии выполняют отсечение для предотвращения переполнения для Planar8
и ARGB8888
форматы. Влажное отсечение отображает все уровни яркости выше 255, к 255, все уровни яркости ниже 0, к 0, и оставляет уровни яркости между 0 и 255, содержащими, неизменными.
Когда пиксель, который будет преобразован, около края изображения — не просто область интереса, но всем изображением которого это - часть — ядро может расшириться вне края изображения, так, чтобы не было никаких существующих пикселей ниже некоторых элементов ядра. Этот сценарий известен как граничный случай, как проиллюстрировано на рисунке 4-3.
В этом случае функции морфологии используют только, что часть ядра, перекрывающего исходный буфер. Другие элементы ядра проигнорированы.
vImage выполняет морфологические операции на полноцветных изображениях следующим образом:
Это разделяет изображение на четыре планарных изображения каждый (одно планарное изображение для каждой альфы, красной, зеленой, и синей)
Это применяет желаемую морфологическую работу к каждой цветной плоскости отдельно, обрабатывая планарные изображения как шкалу полутонов. (Если
kvImageLeaveAlphaUnchanged
флаг установлен, морфологическая работа не выполняется на альфа-канале.)Это повторно комбинирует результаты в полноцветное изображение.
Типы работы
Существует три основных типа морфологических операций: расширение, эрозия и максимизация/минимизация.
Расширение
Расширение исходного изображения (область интереса) ядром определяется следующим образом:
Для каждого исходного пикселя поместите ядро по изображению так, чтобы центральный элемент ядра нашелся по исходному пикселю.
Для каждого пикселя в ядре вычтите значение того пикселя от значения исходного пикселя под ним. Отрицательные промежуточные значения разрешены.
Возьмите минимум всех значений, вычисленных на шаге 2.
Добавьте значение центрального пикселя ядра. Результатом является значение целевого пикселя.
Общее впечатление расширения состоит в том, чтобы взять каждый яркий пиксель в исходном изображении и развернуть его в форму ядра, зеркально отраженного горизонтально и вертикально. Вклад исходного пикселя к области формы ядра зависит от двух вещей: яркость исходного пикселя (более яркие пиксели способствуют больше) и значений пикселей ядра (пиксели, которые являются темными относительно центра ядра, способствуют больше их расположениям в области формы ядра, чем пиксели, которые ярки). Следующее является примером того, как использовать фильтр расширения для изображения в
ARGB8888
формат.Расширение перечисления 4-1 фильтрует пример
int MyDilateFilter(void *inData, unsigned int inRowBytes, void *outData, unsigned int outRowBytes, unsigned int height, unsigned int width, void *kernel, unsigned int kernel_height, unsigned int kernel_width, int divisor, vImage_Flags flags )
{
vImage_Buffer in = { inData, height, width, inRowBytes };
vImage_Buffer out = { outData, height, width, outRowBytes };
const int xOffset = 0;
const int yOffset = 0;
return vImageDilate_ARGB8888( &in, &out, xOffset, yOffset, kernel, kernel_height, kernel_width, flags );
}
Эрозия
Эрозия исходного изображения (область интереса) ядром определяется так же к расширению:
Для каждого исходного пикселя поместите ядро по изображению так, чтобы центральный элемент ядра нашелся по исходному пикселю.
Для каждого пикселя в ядре вычтите значение того пикселя от значения исходного пикселя под ним. Отрицательные промежуточные значения разрешены.
Возьмите минимум всех значений, вычисленных на Шаге 2.
Добавьте значение центрального пикселя ядра. Результатом является значение целевого пикселя.
Перечисление 4-2 показывает, как разрушить изображение.
Эрозия перечисления 4-2 фильтрует пример
int MyErodeFilter(void *inData, unsigned int inRowBytes, void *outData, unsigned int outRowBytes, unsigned int height, unsigned int width, void *kernel, unsigned int kernel_height, unsigned int kernel_width, int divisor, vImage_Flags flags )
{
vImage_Buffer in = { inData, height, width, inRowBytes };
vImage_Buffer out = { outData, height, width, outRowBytes };
const int xOffset = 0;
const int yOffset = 0;
return vImageErode_ARGB8888( &in, &out, xOffset, yOffset, kernel, kernel_height, kernel_width, flags );
}
Вместо того, чтобы развернуть объекты, эрозия имеет тенденцию распространять темные пиксели вокруг, заставление их съедать (разрушает) в объектах. Морфологическая работа, известная как макс., является особым случаем расширять работы, в которой все значения ядра являются тем же. (Не имеет значения, какое определенное значение используется, таким образом, для удобства это, как предполагается, 0.) Точно так же минимальная работа является особым случаем разрушать работы, в которой все значения ядра являются тем же.
Две других известных морфологических операции, открытые и близко, непосредственно не выполняются vImage. В vImage можно выполнить операцию открытия при помощи разрушать работы, сопровождаемой расширять работой. Операция закрытия является расширять работой, сопровождаемой разрушать работой. Если все значения ядра являются тем же, то можно выполнить операцию открытия при помощи минимальной работы, сопровождаемой макс. работой и операцией закрытия при помощи макс. работы, сопровождаемой минимальной работой.