Что такое функция момента
Из предыдущего поста в блоге мы знаем, как разложить контуры по изображениям. Моментный признак — это самый простой способ сравнить два контура, о которых можно судить по их контурным моментам.
Во-первых, моменты контура представляют глобальные характеристики контура, изображения и набора точек. Информация о моменте содержит различные типы геометрических характеристик соответствующих объектов, таких как размер, положение, угол, форма и т. д. Моментные функции широко используются в сценариях распознавания образов и распознавания образов.
расчет момента
В OpenCV он предоставляет нам функцию cv2.moments() для получения контурных моментов изображения, и ее полное определение выглядит следующим образом:
def moments(array, binaryImage=None):
Массив: может быть набором точек, изображением в градациях серого или бинарным изображением. Когда массив представляет собой набор точек, функция будет рассматривать эти наборы точек как вершины контура и рассматривать весь набор точек как контур вместо того, чтобы рассматривать их как независимые точки.
binaryImage: логический тип, когда он равен True, все ненулевые значения в массиве обрабатываются как 1. Этот параметр действителен, только если массив является изображением.
С помощью этой функции мы можем судить, похожи ли два контура. Например, по двум контурам, независимо от того, где они появляются на изображении, мы можем судить о том, согласованы ли их площади с помощью функции моментов функции cv2.moments().
особенности момента
То, что мы сказали выше, в основном пространственные моменты, но моментные признаки делятся на 3 типа, в основном в том числе:
(1) Объемный момент
Момент нулевого заказа: m00
Первый момент: m10,m01
Второй момент: m20, m11, m02
Момент третьего порядка: m30, m21, m12, m03
(2) Центральный момент
Центральный момент второго порядка: mu20, mu11, mu02
Центральные моменты третьего порядка: mu30, mu21, mu12, mu03
(3) Нормированный центральный момент
Моменты Ху второго порядка: nu20, nu11, nu02
Моменты Ху третьего порядка: nu30, nu21, nu12, nu03
Для момента нулевого порядка приведенное выше сравнение может определить, является ли площадь согласованной.
Но для изображений более высокого порядка особенности момента зависят от положения. Для решения этой проблемы родились центральные моменты. Центральный момент - это трансляционная инвариантность, полученная вычитанием среднего, поэтому можно сравнить, согласуются ли два объекта в разных положениях. Очевидно, что центральный момент обладает свойством трансляционной инвариантности.
Помимо перевода, мы также сталкиваемся с масштабированием изображения, то есть нам также нравится иметь возможность судить о его характеристиках после масштабирования. В это время требуется нормированный центральный момент.
Нормированные центральные моменты являются масштабно-инвариантными при делении на общий размер объекта. Он извлекает нормализованное значение атрибута центрального момента объекта с помощью приведенного выше вычисления, которое имеет не только инвариантность к переносу, но и инвариантность к масштабированию.
Функция cv2.moments() будет одновременно вычислять вышеуказанные пространственные моменты, центральные моменты и нормализованные центральные моменты.
Извлечение характерных моментов изображения
Здесь мы все еще анализируем конкретное возвращаемое значение функции через первую картинку этой статьи, код выглядит следующим образом:
import cv2
img = cv2.imread("24.jpg")
cv2.imshow("img", img)
# 转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转换为二值图
ret, binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
# 获取图像的轮廓参数
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):
print(str(i),cv2.moments(contours[i]))
После запуска консоль выдаст следующую информацию:
Как видите, все моменты контура перечислены один за другим. Это как раз соответствует приведенной нами выше классификации признаков моментов.
Вычислить площадь контура
С помощью указанной выше функции момента мы можем рассчитать площадь контура.
В OpenCV он предоставляет нам функцию cv2.contourArea() для вычисления площади контура, которая принимает в качестве параметра контуры возвращаемого значения функции cv2.findContours(). Конкретный код выглядит следующим образом:
import cv2
img = cv2.imread("24.jpg")
cv2.imshow("img", img)
# 转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转换为二值图
ret, binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
# 获取图像的轮廓参数
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):
print("轮廓"+str(i)+"的面积" + str(cv2.contourArea(contours[i])))
После запуска мы получим значение площади 3-х контуров:
С помощью этой функции мы можем фильтровать контуры, площадь которых больше определенного значения или меньше характеристического значения.
Рассчитать длину контура
В OpenCV он предоставляет нам функцию cv2.arcLength() для вычисления длины контура, и ее полное определение выглядит следующим образом:
def arcLength(curve, closed):
кривая: контур
закрытый: логический тип, используемый для указания того, замкнут ли контур. Когда значение равно True, это означает, что контур замкнут.
Здесь все то же самое, используя первое изображение этой статьи в качестве тестового объекта, код выглядит следующим образом:
import cv2
img = cv2.imread("24.jpg")
cv2.imshow("img", img)
# 转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转换为二值图
ret, binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
# 获取图像的轮廓参数
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):
print("轮廓"+str(i)+"的长度" + str(cv2.arcLength(contours[i],True)))
После запуска консоль выдаст следующую информацию: