fundação opencv contorno de 49 imagens recurso de 02 momentos cv2.moments()->(análise de forma, detecção de objeto, reconhecimento de imagem, correspondência)

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. **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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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

insira a descrição da imagem aqui

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
insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/hai411741962/article/details/132180950
Recomendado
Clasificación