OpenCV (25) --- моментная функция

OpenCV
OpenCV (25) --- моментная функция

Что такое функция момента

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

测试图

Во-первых, моменты контура представляют глобальные характеристики контура, изображения и набора точек. Информация о моменте содержит различные типы геометрических характеристик соответствующих объектов, таких как размер, положение, угол, форма и т. д. Моментные функции широко используются в сценариях распознавания образов и распознавания образов.

расчет момента

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

После запуска консоль выдаст следующую информацию:

轮廓长度