Moments Features é um método de representação de recursos para análise de imagens e reconhecimento de padrões, que é usado para descrever a forma, recursos geométricos e informações estatísticas de imagens. Os recursos de momento podem ser usados para tarefas como reconhecer objetos em imagens, detectar formas e executar a classificação de imagens.
Os recursos de momento extraem recursos calculando momentos de ordem superior de pixels de imagem. Esses momentos podem representar propriedades como centro, escala, rotação e forma da imagem. A seguir estão alguns recursos comuns do momento da imagem:
-
Momentos de ordem zero : Descreve o brilho geral ou a área de uma imagem, geralmente expressa como o número de pixels em uma imagem.
-
Momentos de primeira ordem : descreva o centróide, a posição média e a distribuição de uma imagem. Eles são usados para calcular a posição central da imagem.
-
Momentos Centrais : Descreve a distribuição das regiões da imagem em relação ao centróide. Os momentos centrais capturam as propriedades rotacionais e translacionais de uma imagem.
-
Momentos Normalizados : Os momentos são normalizados para obter escala e invariância de rotação. Momentos normalizados podem ser usados para correspondência e identificação.
-
**Momentos Hu: **Construído a partir de sete momentos básicos, com rotação, translação e invariância de escala. Os momentos invariantes de Hu são usados na correspondência de imagens e no reconhecimento de padrões.
Qual é o centróide da imagem?
O centróide de uma imagem é um conceito que representa o centro geométrico de uma imagem. Em um plano bidimensional, o centróide de uma imagem refere-se à posição média de todos os pixels da imagem, ou seja, o centro de gravidade ou centro geométrico da imagem.
Para imagens binárias (imagens em preto e branco), o centróide pode ser calculado por:
Trate cada pixel na imagem como um ponto com coordenadas (x, y). Para cada pixel, calcule a soma de suas coordenadas x e a soma de suas coordenadas y.
Divida a soma pelo número total de pixels na imagem para obter a média das coordenadas x e y, que é a coordenada do centróide.
As coordenadas do centróide representam a posição média da imagem nas direções horizontal e vertical. Em aplicações práticas, o centróide geralmente é usado para descrever as informações de localização da imagem, como a localização do objeto, o centro da forma, etc. Para imagens coloridas multicanal, o centróide de cada canal pode ser calculado separadamente.
Cenários de aplicação de recurso de momento
Os recursos de momento têm muitos cenários de aplicação no campo de processamento de imagens e reconhecimento de padrões e podem ser usados para descrever a forma, propriedades geométricas e distribuição de imagens. A seguir estão alguns cenários comuns de aplicação de recursos de momento:
-
Reconhecimento e classificação de objetos : recursos de momento podem ser usados para extrair a forma e os recursos geométricos de objetos em imagens para reconhecimento e classificação de objetos. Ao comparar as características do momento, é possível julgar se um objeto pertence a uma determinada categoria.
-
Detecção de objetos : Na visão computacional, a detecção de objetos refere-se a encontrar a localização de um objeto específico em uma imagem. As características de momento podem ser usadas para detectar a forma e o contorno de um objeto, ajudando assim a determinar a localização do objeto.
-
Correspondência de imagens : As características de momento podem ser usadas para correspondência e alinhamento de imagens. Ao comparar as características de momento de duas imagens, a semelhança e a relação de transformação entre elas podem ser encontradas.
-
Compressão e codificação de imagem : Os recursos de momento podem ser usados para compressão e codificação de imagem, e o espaço de armazenamento de dados de imagem pode ser reduzido extraindo as principais informações geométricas da imagem.
-
Segmentação de imagem : A segmentação de imagem consiste em dividir a imagem em diferentes regiões, e o recurso de momento pode ser usado para descrever a forma e as propriedades geométricas de diferentes regiões, ajudando assim a segmentar a imagem.
-
Análise de imagens médicas : No campo médico, as características de momento podem ser usadas para analisar tecidos, órgãos e lesões em imagens médicas para extrair formas e características geométricas.
-
Reconhecimento de impressão digital : Os recursos de momento podem ser usados para reconhecimento de impressão digital, extraindo os recursos geométricos de imagens de impressão digital para realizar o reconhecimento e comparação de impressão digital.
-
Análise de imagens de sensoriamento remoto : Em imagens de sensoriamento remoto, os recursos de momento podem ser usados para extrair a forma e a distribuição de objetos do solo, realizando assim aplicações como uso da terra e monitoramento ambiental.
Cálculo de momentos: a função momentos
O OpenCV fornece 函数 cv2.moments()
o recurso de momentos para obter imagens. Normalmente, nos referimos aos recursos de contorno obtidos usando a função cv2.moments() como "momentos de contorno". Os momentos de perfil descrevem os recursos importantes de um perfil e os momentos de perfil podem ser usados para comparar dois perfis de forma conveniente.
O formato de sintaxe da função cv2.moments() é:
retval = cv2.moments( array[, binaryImage] )
- array: Pode ser um conjunto de pontos, uma imagem em tons de cinza ou uma imagem binária. Quando array é um conjunto de pontos, a função tratará esses conjuntos de pontos como vértices no contorno e tratará todo o conjunto de pontos como um contorno em vez de tratá-los como pontos independentes.
- binaryImage: Quando este parâmetro é True, todos os valores diferentes de zero no array são tratados como 1. Este parâmetro só é válido quando a matriz de parâmetros é uma imagem.
A recuperação do valor de retorno desta função é um recurso de momento, incluindo principalmente:
(1) Momentos espaciais
- Momento zero: m00
- Primeiros momentos: m10, m01
- Segundos momentos: m20, m11, m02
- Momentos de terceira ordem: m30, m21, m12, m03
(2) Momentos centrais - Momentos centrais de segunda ordem: mu20, mu11, mu02
- Momento central de terceira ordem: mu30, mu21, mu12, mu03
(3) Momento central normalizado - Momentos Hu de segunda ordem: nu20, nu11, nu02
- Momentos Hu de terceira ordem: nu30, nu21, nu12, nu03
Os momentos acima são calculados de acordo com a fórmula, e a maioria dos momentos são relativamente abstratos. Mas é claro que dois contornos são consistentes se seus momentos forem consistentes. Embora a maioria dos momentos sejam características abstratas calculadas por fórmulas matemáticas,
o significado do momento de ordem zero "m00" é mais intuitivo, que representa a área de um contorno.
Os autovalores retornados pela função de recurso de momento cv2.moments() podem ser usados para comparar se dois contornos são semelhantes. Por exemplo, existem dois contornos, não importa onde eles apareçam na imagem, podemos usar o momento m00 da função cv2.moments() para julgar se suas áreas são consistentes.
Quando a posição muda, embora as feições como a área e o perímetro do contorno permaneçam inalteradas, as feições de ordem superior mudarão conforme a posição muda. Em muitos casos, desejamos comparar a consistência de dois objetos em locais diferentes. A maneira de resolver este problema é introduzir o momento central. Os momentos centrais obtêm a invariância de translação subtraindo a média, permitindo assim a comparação de dois objetos em locais diferentes para concordância. Obviamente, a invariância de translação do momento central permite ignorar a relação posicional de dois objetos e nos ajuda a comparar a consistência de dois objetos em posições diferentes.
Além de considerar a invariância de translação, também consideramos a consistência de objetos dimensionados que são inconsistentes em tamanho. Em outras palavras, esperamos que a imagem possa ter um valor de recurso estável antes e depois do dimensionamento. Ou seja, deixe a imagem ter os mesmos autovalores antes e depois do dimensionamento. Obviamente, o momento central não possui esta propriedade. Por exemplo, dois objetos com a mesma forma e tamanhos diferentes têm momentos centrais diferentes.
O momento central normalizado é invariante em escala, dividindo-se pelo tamanho total do objeto. Ele extrai o valor do atributo de momento central normalizado do objeto por meio do cálculo acima, e o valor do atributo não apenas possui invariância de conversão, mas também invariância de escala.
No OpenCV, a função cv2.moments() calculará simultaneamente o momento espacial acima, o momento central e a distância centralizada normalizada.
Exemplo: Use a função cv2.moments() para extrair feições de uma imagem.
código mostra como abaixo:
import cv2
import numpy as np
o = cv2.imread('moments.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
n=len(contours)
contoursImg=[]
for i in range(n):
temp=np.zeros(o.shape,np.uint8)
contoursImg.append(temp)
contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,255,3)
cv2.imshow("contours[" + str(i)+"]",contoursImg[i])
print("观察各个轮廓的矩(moments):")
for i in range(n):
print("轮廓"+str(i)+"的矩:\n",cv2.moments(contours[i]))
print("观察各个轮廓的面积:")
for i in range(n):
print("轮廓"+str(i)+"的面积:%d" %cv2.moments(contours[i])['m00'])
cv2.waitKey()
cv2.destroyAllWindows()
Neste exemplo, primeiro use a função cv2.moments() para extrair as características de cada contorno; em seguida, use a instrução
cv2.moments(contours[i])['m00']) para extrair as informações de área de cada momento do contorno .
O resultado da operação é o seguinte:
观察各个轮廓的矩(moments):
轮廓0的矩:
{'m00': 14900.0, 'm10': 1996600.0, 'm01': 7800150.0, 'm20': 279961066.6666666, 'm11': 1045220100.0, 'm02': 4110944766.6666665, 'm30': 40842449600.0, 'm21': 146559618400.0, 'm12': 550866598733.3334, 'm03': 2180941440375.0, 'mu20': 12416666.666666627, 'mu11': 0.0, 'mu02': 27566241.666666508, 'mu30': 1.52587890625e-05, 'mu21': 2.09808349609375e-05, 'mu12': 6.198883056640625e-05, 'mu03': 0.000244140625, 'nu20': 0.05592841163310942, 'nu11': 0.0, 'nu02': 0.12416666666666591, 'nu30': 5.630596400372416e-16, 'nu21': 7.742070050512072e-16, 'nu12': 2.2874297876512943e-15, 'nu03': 9.008954240595866e-15}
轮廓1的矩:
{'m00': 34314.0, 'm10': 13313832.0, 'm01': 9728019.0, 'm20': 5356106574.0, 'm11': 3774471372.0, 'm02': 2808475082.0, 'm30': 2225873002920.0, 'm21': 1518456213729.0, 'm12': 1089688331816.0, 'm03': 824882507095.5, 'mu20': 190339758.0, 'mu11': 0.0, 'mu02': 50581695.5, 'mu30': 0.0, 'mu21': 0.0, 'mu12': 0.0, 'mu03': 0.0, 'nu20': 0.16165413533834588, 'nu11': 0.0, 'nu02': 0.042958656330749356, 'nu30': 0.0, 'nu21': 0.0, 'nu12': 0.0, 'nu03': 0.0}
轮廓2的矩:
{'m00': 3900.0, 'm10': 2696850.0, 'm01': 273000.0, 'm20': 1866699900.0, 'm11': 188779500.0, 'm02': 19988800.0, 'm30': 1293351277725.0, 'm21': 130668993000.0, 'm12': 13822255200.0, 'm03': 1522248000.0, 'mu20': 1828125.0, 'mu11': 0.0, 'mu02': 878800.0, 'mu30': 0.0, 'mu21': 0.0, 'mu12': 0.0, 'mu03': 0.0, 'nu20': 0.1201923076923077, 'nu11': 0.0, 'nu02': 0.05777777777777778, 'nu30': 0.0, 'nu21': 0.0, 'nu12': 0.0, 'nu03': 0.0}
观察各个轮廓的面积:
轮廓0的面积:14900
轮廓1的面积:34314
轮廓2的面积:3900
Calcule a área do contorno: função contornoArea
Existe também uma função para calcular a área do contorno separadamente em opencvcontourArea函数
A função cv2.contourArea() é utilizada para calcular a área do contorno. A sintaxe desta função é:
retval =cv2.contourArea(contour [, oriented] ))
O valor de retorno recuperado na fórmula é o valor da área.
Existem dois parâmetros na fórmula:
- contorno é o contorno.
- oriented é um valor booleano. Quando True, o valor retornado contém um sinal de mais/menos para indicar se o contorno é horário ou anti-horário. O valor padrão desse parâmetro é Falso, o que significa que o retorno retornado é um valor absoluto.
Exemplo de código: Use a função cv2.contourArea() para calcular a área de cada contorno.
import cv2
import numpy as np
o = cv2.imread('moments.bmp')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("original",o)
n=len(contours)
contoursImg=[]
for i in range(n):
print("moments["+str(i)+"]面积=",cv2.contourArea(contours[i]))
temp=np.zeros(o.shape,np.uint8)
contoursImg.append(temp)
contoursImg[i]=cv2.drawContours(contoursImg[i],
contours,i,(255,255,255),3)
cv2.imshow("moments[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()
resultado da operação:
moments[0]面积= 14900.0
moments[1]面积= 34314.0
moments[2]面积= 3900.0
Pode-se observar que é igual ao obtido por m00 acima, e a visualização gráfica também é a mesma
Exemplo de código: Com base no acima, filtre os contornos cuja área é maior que 15.000.
código mostra como abaixo:
import cv2
import numpy as np
o = cv2.imread('moments.bmp')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("original",o)
n=len(contours)
contoursImg=[]
for i in range(n):
temp=np.zeros(o.shape,np.uint8)
contoursImg.append(temp)
contoursImg[i]=cv2.drawContours(contoursImg[i],
contours,i,(255,255,255),3)
if cv2.contourArea(contours[i]) > 15000:
print("moments[" + str(i) + "]面积=", cv2.contourArea(contours[i]))
cv2.imshow("moments[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()
Use a instrução "if cv2.contourArea(contours[i])>15000:" para filtrar o valor da área e, em seguida, use a instrução "cv2.imshow("contours[" + str(i)+ "]", contornosImg[ i])" são exibidos.
resultado da operação:
moments[1]面积= 34314.0
Calcular o comprimento (perímetro) do contorno: função arcLength
A função cv2.arcLength() é utilizada para calcular o comprimento do contorno, e seu formato de sintaxe é:
retval = cv2.arcLength( curva, fechado )
O valor de retorno recuperado na fórmula é o comprimento (perímetro) do contorno.
Existem dois parâmetros na fórmula acima:
- curva é o contorno.
- closed é um valor booleano que indica se o contorno está fechado. Quando o valor for True, significa que o contorno está fechado
Exemplo: Exiba os contornos em uma imagem cujo comprimento é maior que a média.
import cv2
import numpy as np
#--------------读取及显示原始图像--------------------
o = cv2.imread('moments.bmp')
#--------------获取轮廓--------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
#--------------计算各轮廓的长度之和、平均长度--------------------
n=len(contours) # 获取轮廓的个数
cntLen=[] # 存储各轮廓的长度
for i in range(n):
cntLen.append(cv2.arcLength(contours[i],True))
print("第"+str(i)+"个轮廓的长度:%d"%cntLen[i])
cntLenSum=np.sum(cntLen) # 各轮廓的长度之和
cntLenAvr=cntLenSum/n # 轮廓长度的平均值
print("轮廓的总长度为:%d"%cntLenSum)
print("轮廓的平均长度为:%d"%cntLenAvr)
resultado da operação:
第0个轮廓的长度:498
第1个轮廓的长度:782
第2个轮廓的长度:254
轮廓的总长度为:1534
轮廓的平均长度为:511
Imagem original de exemplo de código