(Procesamiento de imágenes digitales MATLAB+Python) Capítulo 11 Descripción y análisis de imágenes - Secciones 3 y 4: Expresión geométrica y descripción de formas

1: descripción geométrica

(1) Relación geométrica entre píxeles

R: Adyacencia y conectividad

Primer plano y fondo :

  • Primer plano : Se refiere a un objetivo u objeto de interés en una imagen , que generalmente tiene un valor de píxel más alto (brillo o color) y se distingue visualmente de otras partes. A nivel de píxel, los píxeles de primer plano generalmente se agrupan para formar un área continua , que representa el contorno exterior o la información interna del objetivo.
  • Fondo : se refiere al área de la imagen fuera del primer plano . Generalmente contiene el primer plano y proporciona el entorno y la información contextual del primer plano. Los píxeles de fondo suelen tener valores de píxeles más bajos (brillo o color) y son visualmente distintos de las áreas de primer plano.

Insertar descripción de la imagen aquí

En términos de relaciones geométricas, existen muchas relaciones entre el primer plano y el fondo, como por ejemplo:

  • Segmentación de primer plano y fondo : esta es una tarea importante en el procesamiento de imágenes y la visión por computadora, que consiste en segmentar los objetos de primer plano en la imagen desde el fondo. Al analizar características como las relaciones geométricas, los valores de los píxeles y la textura de los píxeles, se puede realizar una segmentación de primer plano y fondo para identificar y extraer áreas de interés objetivo.
  • Interacción primer plano-fondo : en una imagen, el primer plano y el fondo pueden interactuar o influirse entre sí. Por ejemplo, en la fotografía de retratos, el sujeto suele estar en primer plano y el fondo proporciona un contexto adecuado. Se pueden lograr mejores efectos visuales ajustando la relación entre el primer plano y el fondo.
  • Restricciones de primer plano y fondo : en el campo de la visión por computadora, la relación geométrica entre el primer plano y el fondo se puede utilizar para limitar los resultados del análisis y el procesamiento. Por ejemplo, en el reconocimiento de objetos, la precisión de la detección y clasificación de objetivos se puede mejorar considerando características geométricas como el límite y la relación proporcional entre el primer plano y el fondo.

Caminos y conexiones :

  • Ruta : se refiere a una línea o curva continua de un píxel a otro . En el procesamiento de imágenes y la visión por computadora, las rutas se utilizan a menudo para describir los límites, contornos o conexiones entre píxeles de objetos . Las rutas se pueden representar de diferentes formas, como secuencias de píxeles en imágenes binarias, puntos de borde continuos, polígonos, etc.
    • Ruta de contorno : en la segmentación y el reconocimiento de objetivos, la ruta de contorno representa el límite de forma del objetivo y se forma conectando píxeles en el límite del objetivo.
    • Ruta del esqueleto : la ruta del esqueleto también se denomina eje central, que representa las principales características estructurales o morfológicas del objetivo y se forma conectando los píxeles dentro del objetivo.
  • Conectividad : se refiere a la relación de adyacencia directa entre píxeles, es decir, los píxeles adyacentes están conectados compartiendo bordes o esquinas . A nivel de píxeles, la conectividad se puede definir en términos de cuatro vecindarios u ocho vecindarios. Cuatro vecindarios representan cuatro píxeles adyacentes en las direcciones superior, inferior, izquierda y derecha, y ocho vecindarios representan ocho píxeles adyacentes en la parte superior. , direcciones inferior, izquierda, derecha y diagonal.
    • 4 conectados : en un vecindario de cuatro, si dos píxeles comparten un borde entre ellos, se consideran 4 conectados.
    • 8 conectados : en un vecindario de ocho, si dos píxeles comparten un borde o una esquina, se consideran 8 conectados.
      Insertar descripción de la imagen aquí

B: distancia

Distancia : para píxeles pppag ,qqq zz_z , si se cumplen las siguientes tres condiciones, se llamaddd es la función de distancia o métrica

  • d ( p , q ) ≥ 0 d(p,q)\geq 0re ( pag ,q )0
  • d ( p , q ) = d ( q , p ) d(p,q)=d(q,p)re ( pag ,q )=re ( q ,pag )
  • d ( p , z ) ≤ d ( p , q ) + d ( q , z ) d(p,z)\leq d(p,q)+d(q,z)re ( pag ,z )re ( pag ,q )+re ( q ,z )

Entre ellos, la distancia euclidiana se refiere a

D e ( p , q ) = ( x − s ) 2 + ( y − t ) 2 D_{e}(p, q)=\sqrt{(xs)^{2}+(yt)^{2}}De( p ,q )=( xs )2+( yt )2


Distancia a la ciudad : D 4 ( p , q ) = ∣ x − s ∣ + ∣ y − t ∣ D_{4}(p,q)=|xs|+|yt|D4( p ,q )=∣x _s +yt

Insertar descripción de la imagen aquí

Distancia del tablero : D 8 ( p , q ) = max ( ∣ x − s ∣ , ∣ y − t ∣ ) D_{8}(p,q)=max(|xs|,|yt|)D8( p ,q )=ma x ( xs∣ , _yt )

Insertar descripción de la imagen aquí

(2) Características geométricas entre píxeles.

Una localización

Posición : La posición del objeto en la imagen, representada por el punto central del área del objeto. La distribución de la calidad de la imagen binaria es uniforme y el centroide y el centroide coinciden. Si las coordenadas de posición del píxel correspondientes al objeto en la imagen son (xi, yi) (i = 0, 1,…, n - 1; j = 0, 1,…, m - 1) (x_{i},y_ {i })(i=0, 1,…, n-1; j=0, 1,…, m-1)( xyo,yyo) ( yo=0 ,1 ,,n 1 j=0 ,1 ,,m - 1 ) , entonces las coordenadas de la posición del centro de masa son

x ˉ = 1 metro ∑ yo = 0 norte - 1 ∑ j = 0 metro - 1 xi ; y ˉ = 1 mn ∑ i = 0 n − 1 ∑ j = 0 m − 1 yj \bar{x}=\frac{1}{mn} \sum_{i=0}^{n-1} \sum_{ j=0}^{m-1} x_{i} ; \bar{y}=\frac{1}{mn} \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} y_{j}Xˉ=Minnesota1yo = 0norte 1j = 0m - 1Xyo;yˉ=Minnesota1yo = 0norte 1j = 0m - 1yj

B: Dirección

Dirección : si el objeto es alargado, el eje de la dirección más larga se puede definir como la dirección del objeto. Defina el eje de momento mínimo de segundo orden (el eje equivalente del eje de inercia mínima en un plano bidimensional) como la dirección del objeto más largo. En otras palabras, necesitamos encontrar una línea recta tal que EE definida por la siguiente fórmulaEl valor E es el más pequeño.

E = ∬ r 2 f ( x , y ) dxdy E=\iint r^{2} f(x, y) dxdymi=r2f (x,_y ) d x d y

C: tamaño

Largo y ancho : cuando se conocen los límites de un objeto, usar el tamaño de su rectángulo circunscrito para describir su forma básica es la forma más sencilla de encontrar el rectángulo circunscrito del objeto en la dirección del sistema de coordenadas. Solo necesita calcular las coordenadas máximas y mínimas de los puntos límite del objeto, puede obtener el alcance horizontal y vertical del objeto.

  • Rectángulo circunscrito mínimo : para objetos en cualquier orientación, horizontal y vertical no son las direcciones que nos interesan. Es necesario determinar el eje principal del objeto y luego calcular la longitud en la dirección del eje principal y el ancho en la dirección perpendicular a él que reflejan las características de forma del objeto. Tal rectángulo circunscrito es el eje principal del objeto. eje.

Perímetro : La longitud del límite de una región, utilizada para distinguir objetos con formas simples o complejas; diferentes métodos de representación conducen a diferentes métodos de cálculo.

  • El límite está representado por un código de espacio : si los píxeles de la imagen se consideran pequeños cuadrados por unidad de área, entonces el área y el fondo de la imagen se componen de pequeños cuadrados. El perímetro del área es la suma de las longitudes del área y el espacio del fondo, y el límite está representado por un código de espacio. Por lo tanto, encontrar el perímetro es calcular la longitud del código de espacio.
  • El límite está representado por un código de cadena : cuando los píxeles se consideran puntos, el perímetro está representado por un código de cadena. Encontrar el perímetro es calcular la longitud del código de cadena.
  • El límite se expresa por área : es decir, la suma del número de puntos límite, cada punto ocupa un pequeño cuadrado con un área de 1

Insertar descripción de la imagen aquí

Área : mide el tamaño total de un objeto, que sólo se relaciona con el límite del objeto y no tiene nada que ver con los cambios en su nivel de gris interno. El área de recuento de píxeles es

  • Cuente el número de píxeles dentro del límite (también en el límite)
  • Para una imagen binaria, si se usa 1 para representar el objeto y 0 para representar el fondo, su área son las estadísticas f (x, y) = 1 f(x,y)=1f ( x ,y )=numero de 1

(3) Procedimiento

De la siguiente manera: realice una segmentación de umbral en la imagen y cuente las características geométricas del área

Insertar descripción de la imagen aquí


matlab :

clear,clc,close all;
image=imread('plane.jpg');
BW=im2bw(rgb2gray(image));
figure,imshow(BW),title('二值化图像');
% imwrite(BW,'biplane.jpg');
SE=strel('square',3);
Morph=imopen(BW,SE); 
Morph=imclose(Morph,SE);
figure,imshow(Morph),title('形态学滤波'); 
% imwrite(Morph,'morphplane.jpg');
[B,L]=bwboundaries(1-Morph);
figure,imshow(L),title('划分的区域');
% imwrite(L,'Lplane.jpg');
STATS = regionprops(L,'Area', 'Centroid','Orientation','BoundingBox');
figure,imshow(image),title('检测的区域');
hold on;
for i=1:length(B)
    boundary=B{
    
    i};
    plot(boundary(:,2),boundary(:,1),'r','LineWidth',2);
end
rectangle('Position',STATS.BoundingBox,'edgecolor','g');
hold off;
% STATS


pitón :

import numpy as np
import cv2
import matplotlib.pyplot as plt

image = cv2.imread('plane.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, bw = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
plt.imshow(bw, cmap='gray')
plt.title('二值化图像')
plt.show()

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
morph = cv2.morphologyEx(bw, cv2.MORPH_OPEN, kernel)
morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, kernel)
plt.imshow(morph, cmap='gray')
plt.title('形态学滤波')
plt.show()

contours, _ = cv2.findContours(255 - morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
boundary_image = np.zeros_like(morph)
cv2.drawContours(boundary_image, contours, -1, 255, 1)
plt.imshow(boundary_image, cmap='gray')
plt.title('划分的区域')
plt.show()

stats = []
for contour in contours:
    area = cv2.contourArea(contour)
    centroid = np.mean(contour, axis=0)[0]
    rect = cv2.boundingRect(contour)
    stats.append({
    
    
        'Area': area,
        'Centroid': centroid,
        'BoundingBox': rect
    })

image_with_boundary = image.copy()
for boundary in contours:
    cv2.drawContours(image_with_boundary, [boundary], -1, (0, 0, 255), 2)

for stat in stats:
    cv2.rectangle(image_with_boundary, stat['BoundingBox'], (0, 255, 0), 2)

plt.imshow(cv2.cvtColor(image_with_boundary, cv2.COLOR_BGR2RGB))
plt.title('检测的区域')
plt.show()

2: descripción de la forma

(1) Rectangularidad

Rectangularidad : indicador cuantitativo utilizado para describir qué tan cerca está una entidad o área de un rectángulo. Mide qué tan similar es un objeto o área a un rectángulo en forma, es decir, su compacidad y regularidad . La rectangularidad se calcula comparando el área real del objeto con el área del rectángulo delimitador más pequeño (Rectángulo delimitador) . El rectángulo circundante más pequeño es el rectángulo de área más pequeña que puede rodear completamente el objeto y su largo y ancho son consistentes con la dirección principal del objeto. La fórmula de cálculo de la rectangularidad es la siguiente.

  • A o A_ {o}Ao:El área del objeto
  • AME A_ {MER}AMER: Área del MER

R = A o AMERR=\frac{A_{o}}{A_{MER}}R=AMERAo

La relación entre el ancho y el largo del MER es

r = WMERLMER r=\frac{W_{MER}}{L_{MER}}r=lMERW.MER

(2) Circularidad

R: redondez

Redondez : Indicador cuantitativo utilizado para describir la cercanía de una entidad o área a un círculo . Mide qué tan similar es un objeto o área a un círculo en forma, su circularidad. La redondez se calcula comparando el área real del objeto con el área de un círculo equivalente. Un círculo equivalente es un círculo con la misma área que el objeto, cuyo radio se puede calcular dividiendo el área del objeto por π y luego sacando la raíz cuadrada. La fórmula para calcular la redondez es la siguiente.

  • F = 1 F = 1F=1 : El área es un círculo.
  • F < 1 F < 1F<1 : El área tiene otras formas.
  • Cuanto más compleja sea la curvatura del límite de la región, cuanto más se desvíen las características de la región del círculo, más pequeña será F
    F = 4 π AP 2 F=\frac{4\pi A}{P^{2}}F=PAG24p un _

B: energía límite

Energía límite : función de curvatura de puntos en el límite

  • PÁGINASP : Perímetro del objeto
  • páginasp : La distancia desde el punto en el límite hasta un punto inicial
  • r (p) r(p)r ( p ) : radio de curvatura instantáneo en un punto del límite. es el radio de la circunferencia tangente entre el punto y el límite
  • K(p) K(p)K ( p ) : es una función periódica con período P

K ( p ) = 1 r ( p ) K(p)=\frac{1}{r(p)}K ( p )=r ( p )1

Insertar descripción de la imagen aquí

C: circularidad

Circularidad : es una métrica utilizada para describir la forma de un sólido u objeto lo más cercano a una esfera . Mide qué tan similar es un objeto o área a una esfera en forma. La circularidad se calcula comparando el volumen del objeto con el volumen de una esfera equivalente. Una esfera equivalente es una esfera con el mismo volumen que el objeto, su radio se puede calcular dividiendo el volumen del objeto por (4/3π) y luego sacando la raíz cúbica.

C = μ R σ R 2 μ R = 1 K ∑ k = 0 K − 1 ∥ ( xk , yk ) − ( x ˉ , y ˉ ) ∥ σ R 2 = 1 K ∑ k = 0 K − 1 [ ∥ ( xk , yk ) − ( x ˉ , y ˉ ) ∥ − μ R ] 2 \begin{array}{l}C=\frac{\mu_{R}}{\sigma_{R}^{2}} \\ \mu_{R}=\frac{1}{K} \sum_{k=0}^{K-1}\left\|\left(x_{k}, y_{k}\right)-(\bar {x}, \bar{y})\right\| \\\sigma_{R}^{2}=\frac{1}{K}\sum_{k=0}^{K-1}\left[\left\|\left(x_{k}, y_{ k}\right)-(\bar{x}, \bar{y})\right\|-\mu_{R}\right]^{2}\end{array}C=pagR2metrormetror=k1k = 0K - 1( xk,yk)(Xˉ ,yˉ) pagR2=k1k = 0K - 1[ ( xk,yk)(Xˉ ,yˉ) metror]2

D: Relación de radio del círculo inscrito y del círculo circunscrito

La relación entre el radio del círculo inscrito y el círculo circunscrito : la complejidad de describir el límite de un objeto

  • ri r_ {i}ryo: Radio del círculo inscrito del área
  • rc r_ {c}rc: Área del radio del círculo circunscrito

S = rirc S=\frac{r_{i}}{r_{c}}S=rcryo

Los centros de ambos círculos están en el centro de gravedad de la región.

  • Cuando el área es un círculo, SSSmáx 1.0
  • Para otras formas, hay SSS <1,0
  • SSS no se ve afectado por la traducción regional, la rotación y los cambios de escala.

Insertar descripción de la imagen aquí

E: programa

De la siguiente manera, segmente la imagen original y detecte círculos y rectángulos.

Insertar descripción de la imagen aquí


matlab :

clear,clc,close all;
image=rgb2gray(imread('shape.png'));
figure,imshow(image),title('ԭͼ');
BW=edge(image,'canny');
figure,imshow(BW),title('±ß½çͼÏñ');
% imwrite(BW,'shapeedge.jpg');
SE=strel('disk',5); 
Morph=imclose(BW,SE);
figure,imshow(Morph),title('ÐÎ̬ѧÂ˲¨'); 
% imwrite(Morph,'shapemorph.jpg');
Morph=imfill(Morph,'holes');
figure,imshow(Morph),title('ÇøÓòÌî³ä');
imwrite(Morph,'shapefill.jpg');
[B,L]=bwboundaries(Morph);
figure,imshow(L),title('¼ì²âÔ²ºÍ¾ØÐÎ');
% imwrite(L,'Lplane.jpg');
STATS = regionprops(L,'Area', 'Centroid','BoundingBox');
len=length(STATS);
hold on
for i=1:len
    R=STATS(i).Area/(STATS(i).BoundingBox(3)*STATS(i).BoundingBox(4));
    boundary=fliplr(B{
    
    i});
    everylen=length(boundary);
    F=4*pi*STATS(i).Area/(everylen^2);
    dis=pdist2(STATS(i).Centroid,boundary,'euclidean');
    miu=sum(dis)/everylen;
    sigma=sum((dis-miu).^2)/everylen;
    C=miu/sigma;
    if R>0.9 && F<1 
        rectangle('Position',STATS(i).BoundingBox,'edgecolor','g','linewidth',2);
        plot(STATS(i).Centroid(1),STATS(i).Centroid(2),'g*');
    end
    if R>pi/4-0.1 && R<pi/4+0.1 && F>0.9 && C>10
        rectangle('Position',[STATS(i).Centroid(1)-miu,STATS(i).Centroid(2)-miu,2*miu,2*miu],...
            'Curvature',[1,1],'edgecolor','r','linewidth',2); 
        plot(STATS(i).Centroid(1),STATS(i).Centroid(2),'r*');
    end
end
hold off


pitón :

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并将其转换为灰度图像
image = cv2.imread('shape.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 显示原始图片
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.show()

# 边缘检测
edges = cv2.Canny(gray, 30, 100)

# 显示边缘图片
plt.imshow(edges, cmap='gray')
plt.title('边缘图像')
plt.show()

# 闭运算
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
closed = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)

# 显示闭运算结果
plt.imshow(closed, cmap='gray')
plt.title('闭运算')
plt.show()

# 填充内部空洞
filled = cv2.fillHoles(closed)

# 显示填充结果
plt.imshow(filled, cmap='gray')
plt.title('填充后图像')
plt.show()

# 寻找轮廓并进行形状分析
contours, _ = cv2.findContours(filled, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    area = cv2.contourArea(cnt)
    x, y, w, h = cv2.boundingRect(cnt)
    rect_ratio = area / (w * h)
    perimeter = cv2.arcLength(cnt, True)
    circularity = 4 * np.pi * area / (perimeter ** 2)
    centroid = (int(x + w / 2), int(y + h / 2))
    distance = cv2.pointPolygonTest(cnt, centroid, True)

    if rect_ratio > 0.9 and circularity < 1:
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
        cv2.circle(image, centroid, 3, (0, 255, 0), -1)

    if np.abs(circularity - np.pi / 4) < 0.1 and rect_ratio > 0.9 and distance > 10:
        cv2.rectangle(image, (int(centroid[0] - distance), int(centroid[1] - distance)),
                      (int(centroid[0] + distance), int(centroid[1] + distance)), (0, 0, 255), 2)
        cv2.circle(image, centroid, 3, (0, 0, 255), -1)

# 显示最终结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('形状分析结果')
plt.show()

(3) Transformación del eje central

Un concepto

Transformación del eje medial : Es una tecnología de procesamiento de imágenes utilizada para extraer las características del eje central de un objeto o región . El eje central es una curva que es tangente al límite del objeto y tiene el círculo inscrito más grande. La idea básica de la transformación del eje central es reducir gradualmente el límite del objeto hacia adentro mediante operaciones iterativas hasta alcanzar la posición del eje central . En este proceso, se calcula la distancia desde cada punto límite hasta el círculo inscrito más cercano y estos valores de distancia se suman para formar un campo de distancia. Mediante operaciones de conexión y procesamiento de umbrales, se puede obtener el eje central. Los pasos básicos son los siguientes.

  • Preprocesar la imagen , como escala de grises, binarización y otras operaciones para separar el objeto del fondo.
  • Para encontrar los límites de un objeto , puede utilizar un algoritmo de detección de bordes (como la detección de bordes Canny) para obtener los bordes de una imagen binaria.
  • Inicialice una imagen vacía como un campo de distancia con el mismo tamaño que la imagen original
  • A partir de los puntos límite del objeto, haga lo siguiente para cada punto límite
    • Calcule el radio del círculo inscrito más cercano desde el punto límite actual hasta el interior del objeto.
    • Almacene el valor del radio en la ubicación correspondiente en el campo de distancia
  • Según el umbral del campo de distancia, se binariza para obtener la imagen del eje central.
  • Realice operaciones de conexión y procese la imagen del eje central para que el eje central sea continuo e ininterrumpido.

Insertar descripción de la imagen aquí

La transformación del eje medial se usa comúnmente en campos como el análisis de formas, el procesamiento morfológico y la extracción de características. Al extraer el eje central de un objeto, se puede obtener la información estructural y las características geométricas del objeto, lo que resulta útil para aplicaciones como análisis de formas, reconocimiento de objetivos y reconstrucción de imágenes. Cabe señalar que los resultados de la transformación del eje medial se ven afectados por factores como el preprocesamiento de la imagen, la selección del umbral y los métodos de conexión. Por lo tanto, en aplicaciones prácticas, es posible que sea necesario realizar un ajuste y optimización de parámetros de acuerdo con condiciones específicas para obtener mejores resultados del eje central.

B: Programa

De la siguiente manera, extraiga el esqueleto de la imagen de destino.

Insertar descripción de la imagen aquí


matlab :

clear,clc,close all;
Image=imread('test.bmp');
BW=im2bw(Image);
figure,imshow(BW);
result=bwmorph(BW,'skel',Inf);        
figure,imshow(result);

pitón :

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并转换为二值图像
image = cv2.imread('test.bmp', 0)
ret, bw = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 显示原始二值图像
plt.imshow(bw, cmap='gray')
plt.title('原始二值图像')
plt.show()

# 中轴变换
skeleton = np.zeros_like(bw)
size = np.size(bw)
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))

while True:
    eroded = cv2.erode(bw, element)
    temp = cv2.dilate(eroded, element)
    temp = cv2.subtract(bw, temp)
    skeleton = cv2.bitwise_or(skeleton, temp)
    bw = eroded.copy()

    zeros = size - cv2.countNonZero(bw)
    if zeros == size:
        break

# 显示中轴图像
plt.imshow(skeleton, cmap='gray')
plt.title('中轴图像')
plt.show()

Supongo que te gusta

Origin blog.csdn.net/qq_39183034/article/details/132626065
Recomendado
Clasificación