Python OpenCV — морфологические операции

3 совета для начинающих разработчиков Python Программирование и разработка

Python OpenCV Морфологические операции — это один из методов обработки изображений, который обрабатывает изображение на основе формы. Эта стратегия обработки обычно применяется к бинарным изображениям.

Морфологические операции на основе OpenCV следующие:

  • Erosion
  • Dilation
  • Opening
  • Closing
  • Morphological Gradient
  • Top hat
  • Black hat

Для всех вышеперечисленных методов двумя важными требованиями являются бинарное изображение и элемент структурирования ядра, который используется для скольжения по изображению.

Изображения, использованные для демонстрации

бражения, использованн

Использованные изображения

бражения, использованн2

Использованные изображения

Erosion

Эрозия в первую очередь связана с эрозией внешней поверхности (переднего плана) изображения. Поскольку бинарные изображения содержат только два пикселя 0 и 255, это в первую очередь связано с эрозией переднего плана изображения, и предлагается, чтобы передний план был белым. Толщина эрозии зависит от размера и формы определяемого ядра. Мы можем использовать функцию one() NumPy для определения ядра. Существует множество других функций, таких как нули NumPy, настраиваемые ядра и другие, которые можно использовать для определения ядер в зависимости от рассматриваемой проблемы.

Код:

  • Импортируйте необходимые пакеты, как показано
  • Прочитать изображение
  • Бинаризация изображения.
  • Поскольку рекомендуется сохранять передний план белым, мы выполняем операцию инвертирования OpenCV на двоичном изображении, чтобы сделать передний план белым.
  • Мы определяем ядро ​​​​5 × 5, заполненное единицами
  • Затем мы можем использовать функцию Opencv erode(), чтобы размыть границы изображения.

Python3

# import the necessary packages
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# read the image
img = cv2.imread(r"ownloads\test (2).png", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((5, 5), np.uint8)
 
# invert the image
invert = cv2.bitwise_not(binr)
 
# erode the image
erosion = cv2.erode(invert, kernel,
                    iterations=1)
 
# print the output
plt.imshow(erosion, cmap='gray')

Выход:

На выходе должно получиться более тонкое изображение, чем исходное.

ыходе должно получиться более тонкое изображение

Dilation

Расширение включает расширение внешней поверхности (переднего плана) изображения. Поскольку бинарные изображения содержат только два пикселя 0 и 255, это в первую очередь связано с расширением переднего плана изображения, и предлагается, чтобы передний план был белым. Толщина эрозии зависит от размера и формы определяемого ядра. Мы можем использовать функцию one() NumPy для определения ядра. Существует множество других функций, таких как нули NumPy, настраиваемые ядра и другие, которые можно использовать для определения ядер в зависимости от решаемой проблемы. Это прямо противоположно операции эрозии.

Код:

  • Импортируйте необходимые пакеты, как показано
  • Прочитать изображение
  • Бинаризация изображения.
  • Поскольку рекомендуется сохранять передний план белым, мы выполняем операцию инвертирования OpenCV на двоичном изображении, чтобы сделать передний план белым.
  • Мы определяем ядро ​​3×3, заполненное единицами
  • Затем мы можем использовать функцию Opencv dilate() для расширения границ изображения.

Python 3

import cv2
 
# read the image
img = cv2.imread(r"path to image", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# invert the image
invert = cv2.bitwise_not(binr)
 
# dilate the image
dilation = cv2.dilate(invert, kernel, iterations=1)
 
# print the output
plt.imshow(dilation, cmap='gray')

Выход:

На выходе должно получиться более толстое изображение, чем исходное.

оде должно получиться более толстое изображение, чем ис

Opening

Открытие включает эрозию с последующим расширением внешней поверхности (переднего плана) изображения. Здесь применимы все указанные выше ограничения на эрозию и расширение. Это смесь двух основных методов. Обычно используется для удаления шума на изображении.

Код:

  • Импортируйте необходимые пакеты, как показано
  • Прочитать изображение
  • Бинаризация изображения.
  • Мы определяем ядро ​​3×3, заполненное единицами
  • Затем мы можем использовать функцию Opencv cv.morphologyEx() для выполнения операции открытия изображения.

Python 3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread(r"\noise.png", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255,
                     cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# opening the image
opening = cv2.morphologyEx(binr, cv2.MORPH_OPEN,
                           kernel, iterations=1)
# print the output
plt.imshow(opening, cmap='gray')

Выход:

тие включает эрозию с последующим расширением внешней поверхно

Closing

Закрытие включает расширение с последующей эрозией внешней поверхности (переднего плана) изображения. Здесь применимы все указанные выше ограничения на эрозию и расширение. Это смесь двух основных методов. Обычно используется для удаления шума на изображении.

Код:

  • Импортируйте необходимые пакеты, как показано
  • Прочитать изображение
  • Бинаризация изображения.
  • Мы определяем ядро ​​3×3, заполненное единицами
  • Затем мы можем использовать функцию Opencv cv.morphologyEx() для выполнения операции закрытия изображения.

Python 3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread(r"\Images\noise.png", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# opening the image
closing = cv2.morphologyEx(binr, cv2.MORPH_CLOSE, kernel, iterations=1)
 
# print the output
plt.imshow(closing, cmap='gray')

Выход:

крытие включает расширение с последующей эрозией внешней повер

Morphological Gradient

Морфологический градиент немного отличается от других операций, потому что морфологический градиент сначала применяет к изображению эрозию и расширение по отдельности, а затем вычисляет разницу между размытым и расширенным изображением. На выходе будет схема данного изображения.

Код:

  • Импортируйте необходимые пакеты, как показано
  • Прочитать изображение
  • Бинаризация изображения.
  • Поскольку рекомендуется сохранять передний план белым, мы выполняем операцию инвертирования OpenCV на двоичном изображении, чтобы сделать передний план белым.
  • Мы определяем ядро ​​3×3, заполненное единицами
  • Затем мы можем использовать функцию Opencv cv.morphologyEx() для выполнения морфологического градиента на изображении.

Python 3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread(r"path to your image", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# invert the image
invert = cv2.bitwise_not(binr)
 
# use morph gradient
morph_gradient = cv2.morphologyEx(invert,
                                  cv2.MORPH_GRADIENT, 
                                  kernel)
 
# print the output
plt.imshow(morph_gradient, cmap='gray')

Выход:

орфологический градиент немного отличается от других операций

Top Hat

Top Hat — это еще одна морфологическая операция, в которой открытие выполняется над бинарным изображением, а результатом этой операции является разница между входным изображением и открытым изображением.

Код:

  • Импортируйте необходимые пакеты, как показано.
  • Прочитайте изображение.
  • Бинаризация изображения.
  • Мы определяем ядро ​​13×13, заполненное единицами.
  • Затем мы можем использовать функцию Opencv cv.morphologyEx() для выполнения операции Top Hat над изображением.

Python 3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread("your image path", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((13, 13), np.uint8)
 
# use morph gradient
morph_gradient = cv2.morphologyEx(binr,
                                  cv2.MORPH_TOPHAT,
                                  kernel)
# print the output
plt.imshow(morph_gradient, cmap='gray')

Выход:

Top Hat — это еще одна морфологическая операция, в кот

Читайте также:  Groovy или Java: подробное сравнение и советы по выбору языка
Оцените статью
bestprogrammer.ru
Добавить комментарий