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')

Выход:

Читайте также:  С++ функция std_max

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

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

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')

Выход:

Читайте также:  Функция Vector Erase () в C++

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

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 — это еще одна морфологическая операция, в которой открытие выполняется над бинарным изображением, а результатом этой операции является разница между входным изображением и открытым изображением.

Читайте также:  Объект Object: Что это значит?

Код:

  • Импортируйте необходимые пакеты, как показано.
  • Прочитайте изображение.
  • Бинаризация изображения.
  • Мы определяем ядро ​​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 — это еще одна морфологическая операция, в кот

Оцените статью
bestprogrammer.ru
Добавить комментарий