Python OpenCV Морфологические операции — это один из методов обработки изображений, который обрабатывает изображение на основе формы. Эта стратегия обработки обычно применяется к бинарным изображениям.
Морфологические операции на основе OpenCV следующие:
- Erosion
- Dilation
- Opening
- Closing
- Morphological Gradient
- Top hat
- Black hat
Для всех вышеперечисленных методов двумя важными требованиями являются бинарное изображение и элемент структурирования ядра, который используется для скольжения по изображению.
Изображения, использованные для демонстрации
Использованные изображения
Использованные изображения
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'
)
Выход: