что такое морфология
Прежде чем мы сможем понять коррозию, нам нужно понять концепцию: морфологию.
Морфология, также известная как математическая морфология, является очень важным направлением исследований в области обработки изображений. Морфология в основном извлекает из изображения информацию о компонентах, которая обычно имеет важное значение для выражения и описания формы изображения и обычно является наиболее важной характеристикой формы, используемой для понимания изображения.
Например, при распознавании рукописных цифр информацию о скелете можно получить с помощью морфологических операций, а при специфичном распознавании можно вычислить только скелет. Морфологическая обработка имеет очень важные применения в визуальном обнаружении, распознавании текста, обработке медицинских изображений, кодировании со сжатием изображений и в других областях.
Морфологические операции в основном включают в себя: эрозию, расширение, операцию открытия, операцию закрытия, операцию морфологического градиента, операцию цилиндра, операцию черной шляпы и другие операции. Операция эрозии и операция расширения являются основой морфологических операций.Сочетание эрозии и расширения может реализовать различные формы операций, такие как операция открытия, операция закрытия и морфологический градиент.
Так что этот пост в блоге будет посвящен коррозии и расширению.
коррозия
Эрозия — одна из самых основных морфологических операций, позволяющая устранять граничные точки изображения, сжимать изображение внутрь по границе, а также удалять части, меньшие заданных структурных элементов. Эрозия в основном используется для «сжатия» или «уточнения» переднего плана в бинарном изображении, тем самым реализуя такие функции, как шумоподавление и сегментация элементов.
В процессе эрозии обычно используется структурирующий элемент для сканирования изображения, подлежащего эрозии, пиксель за пикселем, и результат эрозии определяется в соответствии с взаимосвязью между структурирующим элементом и размытым изображением.
Во-первых, давайте посмотрим на карту обработки коррозии:
(1) Указывает, что изображение должно быть размыто.
(2) Структурные элементы
(3) Оранжевые цифры — это все три возможных положения элемента структуры, когда элемент структуры полностью находится внутри объекта переднего плана при обходе изображения, в это время элемент структуры находится в img[2,1], img[ 2,2], изображение[2,3].
(4) Результат коррозии, то есть, когда структурирующий элемент полностью расположен на изображении переднего плана, установите значение пикселя в результате, соответствующем его центральной точке, равным 1; когда структурирующий элемент не полностью расположен на переднем плане изображение, установите его центр Пикселю в результате, соответствующему точке, присваивается значение 0. (побитовое И)
В OpenCV операция эрозии реализована с помощью функции cv2.erode(), которая полностью определена следующим образом:
def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
источник: исходное изображение
ядро: элемент структуры, который можно настроить или сгенерировать с помощью функции cv2.getStructuringElement().
iterations: количество итераций операции эрозии, по умолчанию 1, то есть выполняется только одна операция
Что касается других параметров и значений, то они были представлены в предыдущих сообщениях блога, поэтому я не буду повторять их здесь.
Далее мы используем эту функцию для проверки работы коррозии:
import cv2
import numpy as np
img = cv2.imread("8.jpg",cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9), np.float32)
result = cv2.erode(img,kernel)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
После запуска мы получаем сравнительную таблицу эффектов, которая выглядит следующим образом:
Видно, что операция эрозии стирает заусенцы на исходном изображении.Если вы хотите стереть более серьезно, вы можете установить значение параметра iterations.
зыбь
Уладоливание - это противоположность эрозии, а расширение расширяется границы изображения. Операция расширения объединяет фоновые точки, которые в контакте с текущим объектом (передним планом) в текущий объект, тем самым расширяя граничные точки изображения наружу. Если два объекта в изображении находятся близко друг к другу, они могут быть соединены вместе после расширения.
Операция расширения весьма полезна для заполнения пробелов в изображении после его сегментации. Точно так же инфляция также требует структурирующего элемента для работы. Ниже мы по-прежнему используем матрицу для объяснения принципа расширения.
(1) Исходное изображение для расширения
(2) Структурные элементы
(3) Оранжевая часть означает, что когда структурирующий элемент пересекает исходное изображение, центральный пиксель структурирующего элемента находится в точке [1,1], а когда img[3,3], возможны два случая перекрытия пикселей с цвет переднего плана, на самом деле всего 9 случаев. Такие возможные местоположения совпадают с объектами переднего плана. Центры структурных элементов расположены в img[1,1], img[1,2], img[1,3], img[2,1], img[2,2], img[2,3], img[ 3,1], изображение[3,2], изображение[3,3].
(4) В результирующем изображении, полученном после расширения, в элементе структуры, когда какой-либо пиксель совпадает с объектом переднего плана, значение пикселя в результирующем изображении расширения, соответствующем его центральной точке, равно 1; когда элемент структуры и передний план объект Когда совпадения нет вообще, значение пикселя в изображении результата расширения, соответствующего центральной точке, равно 0. (побитовое ИЛИ)
В OpenCV он предоставляет нам cv2.dilate() для реализации операции расширения изображения. Его полное определение выглядит следующим образом:
def dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
источник: исходное изображение
ядро: структурный элемент
Остальные параметры аналогичны предыдущим и здесь повторяться не будут. Затем мы используем эту функцию для проверки эффекта инфляции, конкретный код выглядит следующим образом:
import cv2
import numpy as np
img = cv2.imread("8.jpg",cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9), np.float32)
result = cv2.dilate(img,kernel)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
После запуска эффект следующий:
Видно, что аватар изображения раздут и соединен с телом, а линии рядом с ним также утолщены. Если вы хотите расшириться более серьезно, вы можете изменить значение параметра iterations.