(Procesamiento de imágenes digitales MATLAB+Python) Capítulo 10 Segmentación de imágenes - Secciones 3 y 4: Segmentación de regiones y segmentación de imágenes basada en agrupaciones

1: división regional

Segmentación de área : generalmente se cree que los píxeles en la misma área tienen ciertas similitudes , como escala de grises, color, textura, etc. La segmentación de área es una tecnología para la segmentación de imágenes basada en las diferencias en las características entre un área específica y otras áreas de fondo.

  • crecimiento regional
  • Fusión de regiones
  • fragmentación regional
  • Fusionar y dividir regiones

(1) Crecimiento regional

R: Principio

Crecimiento de regiones : Es un método de segmentación de imágenes basado en la similitud de píxeles , cuyo objetivo es fusionar gradualmente píxeles con características similares en regiones más grandes . Este método comienza con uno o más píxeles iniciales y eventualmente forma una serie de regiones conectadas agregando gradualmente píxeles adyacentes que son similares a la región actual. El método de crecimiento de regiones es adecuado para segmentar regiones uniformes y continuas, pero puede no ser eficaz cuando se enfrentan texturas débiles, ruido o límites borrosos. Los pasos del algoritmo son los siguientes.

  • Seleccionar puntos semilla : Primero seleccione uno o más píxeles semilla de la imagen como punto de partida. Por lo general, el punto inicial puede seleccionarse manualmente o determinarse automáticamente de acuerdo con algunas reglas específicas (puede ser un solo píxel o una subregión que incluye varios píxeles, seleccionados según el problema específico y utilizando conocimientos previos).
  • Definir criterios de similitud : determine medidas de similitud entre píxeles, como valor de gris, color, textura, etc. Por lo general, se seleccionan píxeles adyacentes cuya similitud con el píxel inicial es superior a un cierto umbral.
  • Expansión inicial : a partir del punto inicial, los píxeles adyacentes se agregan gradualmente al área actual de acuerdo con el criterio de similitud. Puede utilizar recursividad, colas, etc. para expandir el área inicial.
  • Determinar las condiciones de detención : En el proceso de crecimiento de la región, es necesario definir las condiciones de detención, es decir, bajo qué circunstancias se detendrá la fusión. Las condiciones de parada comunes incluyen alcanzar un cierto tamaño de región, una medida de similitud que cae por debajo de un umbral, etc.
  • Iteración : repita el proceso de expansión de semillas y detenga la determinación de la condición hasta que todas las regiones estén completamente segmentadas.

La ventaja del método de crecimiento de regiones es que es simple y fácil de usar y se puede aplicar a muchos problemas de segmentación de imágenes sin necesidad de entrenamiento previo. Sin embargo, es sensible al ruido, las texturas débiles y los límites poco claros, lo que puede provocar una fusión o segmentación incorrecta. Para superar estos problemas, puede considerar introducir algoritmos de segmentación de regiones más complejos, como métodos basados ​​​​en cortes de gráficos, métodos de aprendizaje profundo, etc., para obtener resultados de segmentación más precisos y estables.

B: Ejemplo

Como en el siguiente ejemplo

  • Puntos semilla : (2,2)
  • Criterio de similitud : la diferencia del valor de gris es inferior a 2
  • Selección de barrio : 4 zonas

Insertar descripción de la imagen aquí

c: programa

De la siguiente manera: realice el crecimiento de la región en la imagen. Seleccione semillas de forma interactiva. El criterio de crecimiento adopta "la diferencia promedio en escala de grises entre el píxel a medir y el área es inferior a 40", y se cultiva en el rango de 8 vecindarios. La condición de parada del crecimiento es la saturación del área.
Insertar descripción de la imagen aquí


implementación de matlab :

clear,clc,close all;
Image=im2double(imread('lotus1.jpg'));
[height,width,channel]=size(Image);
if channel==3
    Image=rgb2gray(Image);
end
figure,imshow(Image);
% Image=[1 0 4 6 5 1;1 0 4 6 6 2;0 1 5 5 5 1;0 0 5 6 5 0;0 0 1 6 0 1;1 0 1 2 1 1];
% [height,width,channel]=size(Image);
% figure,imshow(Image);
[seedx,seedy,button] = ginput(1);
seedx=round(seedx);
seedy=round(seedy);
region=zeros(height,width);
region(seedy,seedx)=1;
region_mean=Image(seedy,seedx);
region_num=1;
flag=zeros(height,width);
flag(seedy,seedx)=1;
neighbor=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1];
for k=1:8
    y=seedy+neighbor(k,1);
    x=seedx+neighbor(k,2);
    waiting(k,:)=[y,x];
    flag(y,x)=2;
end

pos=1;
len=length(waiting);
while pos<len
    len=length(waiting);
    current=waiting(pos,:);
    pos=pos+1;
    pixel=Image(current(1),current(2));
    pdist=abs(pixel-region_mean);
    if pdist<40/255 
        region(current(1),current(2))=1;
        region_mean=region_mean*region_num+pixel;
        region_num=region_num+1;
        region_mean=region_mean/region_num;
        for k=1:8   
            newpoint=current+neighbor(k,:);
            if newpoint(1)>0 && newpoint(1)<=height && newpoint(2)>0 && newpoint(2)<width && flag(newpoint(1),newpoint(2))==0
                waiting(end+1,:)=newpoint;
                flag(newpoint(1),newpoint(2))=2;
            end
        end        
    end
end
figure,imshow(region),title('        ');
imwrite(region,'regiongrow.jpg');
    

implementación de Python :

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

# 读取图像
image = cv2.imread('lotus1.jpg')
height, width, channel = image.shape
if channel == 3:
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.imshow(image, cmap='gray')
plt.show()

# [seedx, seedy, button] = ginput(1) 在这里用鼠标点击代替,获取种子点的位置
seedx, seedy = np.round(plt.ginput(1)[0])
seedx, seedy = int(seedx), int(seedy)
region = np.zeros((height, width))
region[seedy, seedx] = 1
region_mean = image[seedy, seedx]
region_num = 1
flag = np.zeros((height, width))
flag[seedy, seedx] = 1
neighbor = np.array([[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]])

waiting = []
for k in range(8):
    y = seedy + neighbor[k, 0]
    x = seedx + neighbor[k, 1]
    waiting.append([y, x])
    flag[y, x] = 2

pos = 0
while pos < len(waiting):
    current = waiting[pos]
    pos += 1
    pixel = image[current[0], current[1]]
    pdist = abs(pixel - region_mean)
    if pdist < 40 / 255:
        region[current[0], current[1]] = 1
        region_mean = region_mean * region_num + pixel
        region_num += 1
        region_mean /= region_num
        for k in range(8):
            newpoint = current + neighbor[k]
            if 0 < newpoint[0] <= height and 0 < newpoint[1] < width and flag[newpoint[0], newpoint[1]] == 0:
                waiting.append(newpoint)
                flag[newpoint[0], newpoint[1]] = 2

plt.imshow(region, cmap='gray')
plt.title('')
plt.show()

cv2.imwrite('regiongrow.jpg', region * 255)

(2) Fusión regional

R: Principio

Fusión de regiones : Es una técnica de segmentación de imágenes cuyo objetivo principal es generar regiones de imágenes más grandes con características similares fusionando píxeles o regiones adyacentes . A diferencia del crecimiento de regiones, la fusión de regiones es un método ascendente que comienza desde un solo píxel o una región pequeña y fusiona gradualmente regiones adyacentes hasta que se cumplan ciertas condiciones de fusión predefinidas. Los pasos del algoritmo son los siguientes.

  • Inicialización : trate cada píxel o área pequeña como un área independiente.
  • Medida de similitud : defina una métrica para medir la similitud de dos regiones, que puede incluir características como el valor de píxel, el color, la textura, la forma, etc. Un valor de similitud más bajo significa que las regiones son más similares.
  • Condición de fusión : establezca una condición de fusión para determinar si dos regiones adyacentes deben fusionarse en función de la medida de similitud. Esto puede ser un umbral, lo que significa que solo se pueden fusionar regiones con similitudes por encima del umbral.
  • Fusión de regiones : comenzando desde una región pequeña, repita cada píxel o región de la imagen, verificando la similitud con las regiones vecinas. Si la similitud de dos regiones adyacentes es mayor que la condición de fusión, se fusionan en una región más grande.
  • Iteración : Es posible que se requieran múltiples iteraciones para alcanzar el estado fusionado final porque fusionar una región puede afectar las condiciones de fusión de otras regiones.

La ventaja de la fusión de regiones es que puede manejar el ruido y los límites borrosos y, al mismo tiempo, producir resultados de segmentación más suaves. Sin embargo, la elección de las condiciones de fusión y la implementación del algoritmo afectarán el efecto de segmentación final. Además, el método de fusión de regiones puede ignorar algunos detalles e información de textura, por lo que en algunos casos es posible que no se obtengan resultados de segmentación finos. La fusión de regiones se utiliza a menudo en el análisis de imágenes médicas, el análisis de escenas naturales, la interpretación de imágenes de teledetección y otros campos en aplicaciones prácticas. Puede ser una herramienta útil, especialmente cuando es necesario generar segmentaciones de regiones más grandes.

B: Ejemplo

Insertar descripción de la imagen aquí

c: programa

Divida la imagen pequeña del ejemplo en dos regiones mediante la fusión de regiones

  • Inicialización : Cada píxel es un área pequeña; el criterio de similitud adopta: la diferencia media del nivel de gris de las áreas adyacentes ≤ 2; el primer punto en la esquina superior izquierda se establece en el área 1 y el resto es 0, lo que indica que no es marcado.
  • Escanee la imagen por primera vez : de izquierda a derecha, de arriba a abajo, determine la distancia en escala de grises de cada punto a sus puntos vecinos superior izquierdo, superior e izquierdo. Si la menor de las tres distancias cumple con las reglas de fusión, la Al punto vecino correspondiente se le asignará una marca. El punto actual; si no hay un punto similar, asigne una nueva marca al punto actual.
  • Escanee la imagen nuevamente : si las marcas en un determinado punto de píxel y el punto vecino izquierdo son inconsistentes, pero la marca del punto actual es consistente con uno de los puntos vecinos, determine si las dos áreas son iguales y, de ser así, , modificar las marcas de las dos áreas para que sean una más pequeña, es decir, fusión regional

implementación de matlab :

clear,clc,close all;

Image=[1 0 4 6 5 1;1 0 4 6 6 2;0 1 5 5 5 1;0 0 5 6 5 0;0 0 1 6 0 1;1 0 1 2 1 1];
[height,width,channel]=size(Image);
flag=zeros(height,width);
thresh=2;
neighbor=[-1 -1;-1 0;0 -1];
flag(1,1)=1;
number=1;
for j=1:height
    for i=1:width       
        pdist=[300 300 300];
        for k=1:3
            y=j+neighbor(k,1);
            x=i+neighbor(k,2);
            if x>=1 && y>=1
                pdist(k)=abs(Image(j,i)-Image(y,x));
            end
        end
        [mindist,pos]=min(pdist(:));
        if mindist<=thresh
            y=j+neighbor(pos,1);
            x=i+neighbor(pos,2);
            if flag(y,x)
                flag(j,i)=flag(y,x);
            end
        elseif mindist~=300
            number=number+1;
            flag(j,i)=number;            
        end
    end
end

for j=2:height
    for i=2:width  
        if flag(j-1,i)~=flag(j,i-1) && (flag(j,i)==flag(j-1,i) || flag(j,i)==flag(j,i-1))
            pdist=abs(Image(j-1,i)-Image(j,i-1));            
            if pdist<=thresh
                minv=min(flag(j-1,i),flag(j,i-1));
                maxv=max(flag(j-1,i),flag(j,i-1));
                flag(flag==maxv)=minv; 
            end
        end
    end
end       

implementación de Python :

import numpy as np
import matplotlib.pyplot as plt

Image = np.array([[1, 0, 4, 6, 5, 1],
                  [1, 0, 4, 6, 6, 2],
                  [0, 1, 5, 5, 5, 1],
                  [0, 0, 5, 6, 5, 0],
                  [0, 0, 1, 6, 0, 1],
                  [1, 0, 1, 2, 1, 1]])

height, width = Image.shape
flag = np.zeros((height, width))
thresh = 2
neighbor = np.array([[-1, -1], [-1, 0], [0, -1]])
flag[0, 0] = 1
number = 1

for j in range(height):
    for i in range(width):
        pdist = [300, 300, 300]
        for k in range(3):
            y = j + neighbor[k, 0]
            x = i + neighbor[k, 1]
            if x >= 0 and y >= 0:
                pdist[k] = abs(Image[j, i] - Image[y, x])
        mindist, pos = min((val, idx) for (idx, val) in enumerate(pdist))
        if mindist <= thresh:
            y = j + neighbor[pos, 0]
            x = i + neighbor[pos, 1]
            if flag[y, x]:
                flag[j, i] = flag[y, x]
        elif mindist != 300:
            number += 1
            flag[j, i] = number

for j in range(1, height):
    for i in range(1, width):
        if flag[j - 1, i] != flag[j, i - 1] and (flag[j, i] == flag[j - 1, i] or flag[j, i] == flag[j, i - 1]):
            pdist = abs(Image[j - 1, i] - Image[j, i - 1])
            if pdist <= thresh:
                minv = min(flag[j - 1, i], flag[j, i - 1])
                maxv = max(flag[j - 1, i], flag[j, i - 1])
                flag[flag == maxv] = minv

plt.imshow(flag, cmap='tab20')
plt.title('')
plt.show()

(3) División regional

R: Principio

División de regiones : es una tecnología de segmentación de imágenes. A diferencia de la fusión de regiones, comienza desde una región general y divide gradualmente la región en subregiones más pequeñas hasta que se cumplan ciertas condiciones de segmentación predeterminadas . La tecnología de división de regiones generalmente adopta un enfoque de arriba hacia abajo, comenzando desde un todo y descomponiéndolo gradualmente en subregiones hasta que cada subregión cumpla con condiciones específicas. Los pasos del algoritmo son los siguientes.

  • Inicialización : trate la imagen completa o el área completa como un área inicial.
  • Condición de división : establezca una condición de división para determinar si un área debe dividirse en subáreas según ciertos criterios específicos. Esto puede involucrar características como valores de píxeles, color, textura, forma, etc.
  • División de regiones : comenzando desde la región inicial, verifique si la región cumple con las condiciones de división. Si se cumplen las condiciones, el área se divide en subáreas más pequeñas.
  • Recursivo : para cada subregión, si se cumplen las condiciones para la división continua, la subregión continuará dividiéndose de forma recursiva hasta que ya no se cumplan las condiciones de la división.
  • Repetir : repita los pasos recursivos y de división de regiones hasta que se dividan todas las regiones que cumplan las condiciones.

La ventaja de la división de regiones es que puede comenzar desde el conjunto y descomponerlo gradualmente en subregiones con características similares, obteniendo así resultados de segmentación más precisos. Sin embargo, la elección de las condiciones de división y la implementación del algoritmo afectarán el efecto de segmentación final. Además, el algoritmo de división de regiones puede producir demasiadas regiones pequeñas en algunos casos, lo que genera problemas de sobresegmentación. La división de regiones se utiliza generalmente en el análisis de imágenes médicas, la detección de objetos, la segmentación de imágenes y otros campos en aplicaciones prácticas. La división de regiones puede ser una herramienta útil cuando necesita segmentar una imagen en varias regiones con características similares

B: Ejemplo

1: Inicialización y determinación de criterios y métodos.

  • La diferencia entre el valor de gris máximo y el valor de gris mínimo en el área ≤ \leq 2
  • Utilice el método de división de dividir en cuatro

Insertar descripción de la imagen aquí

2: Utilice el método de división para dividirlo en cuatro

Insertar descripción de la imagen aquí

Calcule las diferencias máximas y mínimas en escala de grises para cuatro áreas pequeñas respectivamente y compárelas con el umbral 2. Cada área debe dividirse.

Insertar descripción de la imagen aquí

Y así sucesivamente hasta que ya no se puedan dividir todas las áreas.

Insertar descripción de la imagen aquí

c: programa

como sigue

Insertar descripción de la imagen aquí


implementación de matlab :

Image=imread('cameraman.jpg');          
S=qtdecomp(Image,0.27);                       
blocks=repmat(uint8(0),size(S));     
for dim=[256 128 64 32 16 8 4 2 1]
    numblocks=length(find(S==dim));
    if(numblocks>0)
        values=repmat(uint8(1),[dim dim numblocks]);
        values(2:dim,2:dim,:)=0;
        blocks=qtsetblk(blocks,S,dim,values);
    end
end


implementación de Python :

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

# 读取图像
Image = cv2.imread('cameraman.jpg', cv2.IMREAD_GRAYSCALE)

# 进行 Quadtree 分解
S, _ = cv2.qr(Image, 0.27)

blocks = np.zeros_like(S, dtype=np.uint8)

for dim in [256, 128, 64, 32, 16, 8, 4, 2, 1]:
    numblocks = np.sum(S == dim)
    if numblocks > 0:
        values = np.ones((dim, dim, numblocks), dtype=np.uint8)
        values[1:dim, 1:dim, :] = 0
        blocks = cv2.qt_set_block(blocks, S, dim, values)

plt.imshow(blocks, cmap='gray')
plt.title('')
plt.show()

(4) División regional y fusión

R: Principio

División y fusión de regiones : es un método de segmentación de imágenes que combina las ideas de segmentación y fusión de regiones, con el objetivo de segmentar la imagen en regiones con características similares mediante un método ascendente. Este método primero divide la imagen en áreas pequeñas iniciales y luego fusiona gradualmente áreas adyacentes de acuerdo con ciertos criterios de fusión para obtener áreas más grandes y consistentes. El objetivo del método de división y fusión de regiones es generar resultados de segmentación precisos basados ​​en el uso completo de la coherencia local. Los pasos del algoritmo son los siguientes.

  • Segmentación inicial : divida toda la imagen en áreas pequeñas iniciales, cada área puede ser un solo píxel o un área local más grande.
  • Proceso de división : Primero, se realiza un juicio de división en cada área. Las condiciones de juicio pueden ser similitud entre píxeles, consistencia de color, etc. Si una región no cumple con las condiciones de división, entonces la región ya no se dividirá; de lo contrario, la región continuará dividiéndose en subregiones más pequeñas.
  • Proceso de fusión : En el área pequeña obtenida al dividir, determine si las áreas adyacentes cumplen con las condiciones de fusión, las condiciones de fusión pueden ser que la similitud sea mayor que el umbral, etc. Si las regiones adyacentes cumplen las condiciones de fusión, combínelas en una región más grande
  • Iteración : el proceso de división y fusión se realiza repetidamente hasta que no se pueden realizar más divisiones y fusiones, generando el resultado final de la segmentación.

La ventaja de la división y fusión de regiones es que puede procesar regiones de diferentes tamaños en un proceso ascendente, obteniendo así una gama más amplia de resultados de segmentación y manteniendo la coherencia local. Sin embargo, la eficiencia de este método puede verse afectada por la elección de las condiciones de fusión y segmentación de regiones y la implementación del algoritmo. La división y fusión de regiones se utilizan ampliamente en aplicaciones prácticas en análisis de imágenes médicas, interpretación de imágenes de teledetección, análisis de escenas naturales y otros campos, y son especialmente adecuadas para tareas de segmentación de imágenes en escenas complejas.

B: Ejemplo

Insertar descripción de la imagen aquí

2: segmentación de imágenes basada en agrupación

(1) Principio

Segmentación de imágenes basada en agrupación : piense en la segmentación de imágenes como un problema de clasificación de píxeles . Los píxeles se representan como puntos en el espacio de características. El algoritmo de agrupación se utiliza para dividir estos puntos en diferentes categorías. La imagen original correspondiente es agrupar los píxeles. ., utilice "marcadores de componentes conectados" para buscar regiones conectadas después de agruparlas. Cómo representar píxeles como puntos en el espacio de características
: use vectores para representar píxeles o la vecindad alrededor de los píxeles. Los elementos del vector son características relacionadas con los píxeles. Según las condiciones específicas de la imagen, el diseño se basa en juzgar los puntos en común de las áreas a segmentar.

(2) Agrupación de K-medias

  • Omitido (verifique la columna de agrupación)

(3) Procedimiento

como sigue:
Insertar descripción de la imagen aquí


implementación de matlab :

clear,clc,close all;
Image=imread('fruit.jpg');
imshow(Image);
hsv=rgb2hsv(Image);
h=hsv(:,:,1);
h(h>330/360)=0;
[N,M]=size(h);
training=h(:);
startdata = [0;60/360;120/360;180/360;240/360;300/360];
[IDX,C]= kmeans(training,6,'Start',startdata);
idbw = (IDX == 1);
template = reshape(idbw, size(h));
figure,imshow(template),title('分割后的图像');
imwrite(template,'clusterseg.jpg');

implementación de Python :

import cv2
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 读取图像
Image = cv2.imread('fruit.jpg')
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2RGB)

# 显示原始图像
plt.imshow(Image)
plt.title('')
plt.show()

# 转换为HSV颜色空间并提取H通道
hsv = cv2.cvtColor(Image, cv2.COLOR_RGB2HSV)
h = hsv[:, :, 0]
h[h > 330] = 0  # 将大于330的值设为0

N, M = h.shape
training = h.reshape(-1, 1)
startdata = np.array([0, 60, 120, 180, 240, 300]) / 360

# 使用K均值聚类进行分割
kmeans = KMeans(n_clusters=6, init=startdata.reshape(-1, 1), n_init=1)
kmeans.fit(training)
labels = kmeans.labels_
centers = kmeans.cluster_centers_

idbw = (labels == 0)
template = idbw.reshape((N, M))

# 显示分割后的图像
plt.imshow(template, cmap='gray')
plt.title('')
plt.show()

cv2.imwrite('clusterseg.jpg', template * 255)

Supongo que te gusta

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