.

Procesamiento de Imagenes
Teoria explicada

0

Days

0

Hours

0

Minutes

0

Seconds

 

Ejemplos

  • pip install opencv-python


  • imagen en gris y guardar

import cv2

img= cv2.imread("1.jpeg", 0)


cv2.namedWindow("caballo", cv2.WINDOW_NORMAL)

cv2.imshow("caballo", img)


cv2.waitKey()

cv2.destroyAllWindows()


  • Guardar imagen en escala de grises

import cv2


img= cv2.imread("1.jpeg", 0)


cv2.namedWindow("caballo", cv2.WINDOW_NORMAL)

cv2.imshow("caballo", img)


cv2.imwrite('1-bw.jpeg', img)


cv2.waitKey()

cv2.destroyAllWindows()


  • Mostrar el histograma a color y bw

import cv2

from matplotlib import pyplot as plt


img= cv2.imread("1.jpeg")

color = ('b', 'g', 'r') #para la imagen a color

hist = cv2.calcHist([img],[0],None,[256],[0,255]) #histograma bw


for i, col in enumerate(color): #para el histograma a color

    

    print(i,col)

    hist = cv2.calcHist([img],[i],None,[256],[0,255])


    plt.plot(hist, color = col)

    plt.xlim([0,256])


plt.hist(img.ravel(), 256, [0,255])

plt.show()


cv2.namedWindow("caballo", cv2.WINDOW_NORMAL)

cv2.imshow("caballo", img)


cv2.waitKey()

cv2.destroyAllWindows()


  • histograma bw y color con numpy

import numpy as np

from matplotlib import pyplot as plt

import cv2


img = cv2.imread("1.jpeg")

img2 = cv2.imread("1.jpeg",0)


hist, bins = np.histogram(img.flatten(),256,[0,255])

plt.hist(img.flatten(), 256, [0,255], color = "b")

plt.xlim([0,256])

#plt.show()


hist, bins = np.histogram(img2.flatten(),256,[0,255])

plt.hist(img2.flatten(), 256, [0,255], color = "y")

plt.xlim([0,256])

plt.show()


cv2.waitKey()

cv2.destroyAllWindows()


  • Imagen bw, aplicar umbralización binaria

    import cv2

img = cv2.imread("1.jpeg", 0)

## umbral establecido, imagenBinarizada = cv2.threshold(imagen, valor del umbral, valor umbral maximo y tipo de algoritmo)

_, th=cv2.threshold(img, 89, 255, cv2.THRESH_BINARY)


cv2.imshow("original", img)

cv2.imshow("Binarizacion", th)


cv2.waitKey()

cv2.destroyAllWindows()


  • Imagen bw, aplicar umbralización otsu

import cv2

img = cv2.imread("1.jpeg", 0)

## umbral establecido, imagenBinarizada = cv2.threshold(imagen, valor del umbral, valor umbral maximo y tipo de algoritmo)

_, th=cv2.threshold(img, 89, 255, cv2.THRESH_OTSU)


cv2.imshow("original", img)

cv2.imshow("Otsu", th)


cv2.waitKey()

cv2.destroyAllWindows()


  • A la imagen médica aplicar umbralización usando ADAPTATIVE_THRESH_MEAN_C, y ADAPTATIVE_THRESH_GAUSSIAN_C, con su Trackbar


import cv2

import numpy as np


# Función callback para los trackbars (no necesita hacer nada)

def nothing(x):

    pass


# Cargar imagen médica en escala de grises

img = cv2.imread('1.jpeg', cv2.IMREAD_GRAYSCALE)  # Cambia la ruta


# Crear ventana y trackbars

cv2.namedWindow('Umbralizacion Adaptativa')

cv2.createTrackbar('Metodo', 'Umbralizacion Adaptativa', 0, 1, nothing)

cv2.createTrackbar('Tamano Bloque', 'Umbralizacion Adaptativa', 3, 200, nothing)

cv2.createTrackbar('C', 'Umbralizacion Adaptativa', 1, 30, nothing)


while True:

    # Obtener valores actuales de los trackbars

    metodo = cv2.getTrackbarPos('Metodo', 'Umbralizacion Adaptativa')

    block_size = cv2.getTrackbarPos('Tamano Bloque', 'Umbralizacion Adaptativa')

    c = cv2.getTrackbarPos('C', 'Umbralizacion Adaptativa')

    

    # Asegurar que el tamaño de bloque sea impar y mayor que 1

    block_size = max(3, block_size)

    block_size = block_size + 1 if block_size % 2 == 0 else block_size

    

    # Aplicar umbralización adaptativa

    if metodo == 0:

        adaptive_method = cv2.ADAPTIVE_THRESH_MEAN_C

    else:

        adaptive_method = cv2.ADAPTIVE_THRESH_GAUSSIAN_C

    

    resultado = cv2.adaptiveThreshold(img, 255, adaptive_method,

                                    cv2.THRESH_BINARY, block_size, c)

    

    # Mostrar resultados

    cv2.imshow('Imagen Original', img)

    cv2.imshow('Umbralizacion Adaptativa', resultado)

    

    # Salir con ESC

    k = cv2.waitKey(1) & 0xFF

    if k == 27:

        break


cv2.destroyAllWindows()


  • Realizar un solo código de la umbralización, binaria, outsu, ADAPTATIVE_THRESH_MEAN_C, y ADAPTATIVE_THRESH_GAUSSIAN_C, con su Trackbar


import cv2

import numpy as np


def nothing(x):

    pass


# Cargar imagen médica en escala de grises

img = cv2.imread('1.jpeg', cv2.IMREAD_GRAYSCALE)  # Cambia la ruta


# Crear ventana principal

cv2.namedWindow('Umbralizacion')

cv2.resizeWindow('Umbralizacion', 800, 600)


# Crear trackbars

cv2.createTrackbar('Metodo', 'Umbralizacion', 0, 3, nothing)

cv2.createTrackbar('Umbral/Block Size', 'Umbralizacion', 127, 255, nothing)

cv2.createTrackbar('C', 'Umbralizacion', 2, 30, nothing)


# Textos para los métodos

metodos = {

    0: 'BINARIA MANUAL',

    1: 'OTSU AUTOMATICO',

    2: 'ADAPTATIVA (MEAN)',

    3: 'ADAPTATIVA (GAUSSIAN)'

}


while True:

    # Obtener valores actuales

    metodo = cv2.getTrackbarPos('Metodo', 'Umbralizacion')

    param1 = cv2.getTrackbarPos('Umbral/Block Size', 'Umbralizacion')

    c = cv2.getTrackbarPos('C', 'Umbralizacion')

    

    # Procesamiento según método

    if metodo == 0:  # Binaria manual

        _, resultado = cv2.threshold(img, param1, 255, cv2.THRESH_BINARY)

        texto = f"Umbral manual: {param1}"

        

    elif metodo == 1:  # Otsu

        thresh, resultado = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

        texto = f"Otsu - Umbral autocalculado: {thresh:.1f}"

        

    else:  # Adaptativas

        block_size = max(3, param1)

        block_size = block_size + 1 if block_size % 2 == 0 else block_size

        

        if metodo == 2:  # Mean

            resultado = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, 

                                             cv2.THRESH_BINARY, block_size, c)

        else:  # Gaussian

            resultado = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 

                                             cv2.THRESH_BINARY, block_size, c)

        texto = f"Block: {block_size} | C: {c}"

    

    # Añadir información visual

    cv2.putText(resultado, metodos[metodo], (10, 30), 

                cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 1)

    cv2.putText(resultado, texto, (10, 60), 

                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)

    

    # Mostrar resultados

    cv2.imshow('Original', img)

    cv2.imshow('Umbralizacion', resultado)

    

    # Salir con ESC

    if cv2.waitKey(1) & 0xFF == 27:

        break


cv2.destroyAllWindows()


  • Otra versión pero con 4 ventanas


import cv2

import numpy as np


def nothing(x):

    pass


# Cargar imagen médica

img = cv2.imread('1.jpeg', cv2.IMREAD_GRAYSCALE)  # Cambiar por tu ruta


# Crear ventana de control

cv2.namedWindow('Controles')

cv2.resizeWindow('Controles', 400, 150)


# Trackbars comunes

cv2.createTrackbar('Umbral/Block', 'Controles', 127, 255, nothing)

cv2.createTrackbar('C', 'Controles', 2, 30, nothing)


# Diccionario de métodos

metodos = {

    'BINARIA': cv2.THRESH_BINARY,

    'OTSU': cv2.THRESH_OTSU,

    'ADAPT-MEAN': cv2.ADAPTIVE_THRESH_MEAN_C,

    'ADAPT-GAUSS': cv2.ADAPTIVE_THRESH_GAUSSIAN_C

}


while True:

    # Leer parámetros actuales

    param1 = cv2.getTrackbarPos('Umbral/Block', 'Controles')

    c = cv2.getTrackbarPos('C', 'Controles')

    

    # Asegurar tamaño de bloque impar para adaptativas

    block_size = max(3, param1)

    block_size = block_size + 1 if block_size % 2 == 0 else block_size

    

    # Procesar con los 4 métodos

    resultados = {}

    

    # 1. Binarización manual

    _, thresh_bin = cv2.threshold(img, param1, 255, cv2.THRESH_BINARY)

    resultados['BINARIA'] = thresh_bin

    

    # 2. Otsu

    thresh_otsu, thresh_otsu_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

    resultados['OTSU'] = thresh_otsu_img

    

    # 3. Adaptativa Mean

    adapt_mean = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, 

                                      cv2.THRESH_BINARY, block_size, c)

    resultados['ADAPT-MEAN'] = adapt_mean

    

    # 4. Adaptativa Gauss

    adapt_gauss = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 

                                       cv2.THRESH_BINARY, block_size, c)

    resultados['ADAPT-GAUSS'] = adapt_gauss

    

    # Mostrar todas las ventanas con texto informativo

    for metodo, resultado in resultados.items():

        # Añadir información de parámetros

        texto = f"{metodo} | "

        if metodo == 'BINARIA':

            texto += f"Umbral: {param1}"

        elif metodo == 'OTSU':

            texto += f"Auto: {thresh_otsu:.1f}"

        else:

            texto += f"Block: {block_size} | C: {c}"

        

        display = cv2.putText(resultado.copy(), texto, (10,30), 

                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,255,255), 1)

        

        cv2.imshow(metodo, display)

    

    # Salir con ESC

    if cv2.waitKey(1) & 0xFF == 27:

        break


# Destruir todas las ventanas

cv2.destroyAllWindows()



Get your Ticket.

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Explicabo, cupiditate necessitatibus sapiente nisi soluta placeat esse velit dolorem eius aliquam!

Speakers.

Lorem ipsum dolor sitope amet, consectetur adipisicing elitip. Massumenda, dolore!

Sarah Parker

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

Anton Smith

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.

Adrianna Anderson

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula.

Liam Jameson 

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Lorem ipsum dolor sit amet.

Sophia Havering 

Lorem ipsum dolor sit amet, consectetuer adipiscing.

Emma Connor

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.

Agenda.

1. Definición de Procesamiento Digital de Imágenes (PDI)

El Procesamiento Digital de Imágenes es una rama de la visión artificial que emplea técnicas algorítmicas para manipular imágenes digitales mediante operaciones en el dominio espacial (píxeles) o frecuencial (transformaciones espectrales). Incluye métodos como filtrado, segmentación, realce de contraste y extracción de características, con el objetivo de mejorar la calidad visual, reducir ruido o facilitar el análisis automatizado.



2. Elementos básicos de una imagen

  • Píxel: Unidad mínima de información, con valores de tono, saturación y brillo.

  • Resolución: Dimensiones espaciales (M×N píxeles) y de intensidad (niveles de gris: �=2�L=2k).

  • Espacios de color: Modelos como RGB (rojo, verde, azul), HSV (tono, saturación, valor) y CMYK (cian, magenta, amarillo, negro).

  • Ejes de coordenadas: Sistema de referencia para ubicar píxeles, comúnmente con origen en la esquina superior izquierda.



3. Procesamiento Digital de Imágenes Médicas (PDIM)

Es la aplicación de técnicas computacionales para analizar imágenes adquiridas mediante modalidades como RMN, TAC o ultrasonido. Incluye procesos como segmentación de tejidos, corrección de artefactos, mejora de contraste y cuantificación de parámetros clínicos, con fines de diagnóstico, planificación quirúrgica o investigación biomédica.



4. Tabla comparativa: Muestreo vs. Cuantificación

AspectoMuestreoCuantificación
DefiniciónDiscretización de coordenadas (x, y).Discretización de niveles de intensidad.
RepresentaciónMatriz de píxeles (M×N).Valores enteros en rango [0, L-1].
EjemploImagen digital de 512×512 píxeles.8 bits por píxel (256 niveles de gris).


5. Funciones de las librerías

  • NumPy: Manejo eficiente de arrays multidimensionales para operaciones matemáticas (ej: manipulación de matrices de imágenes).

  • Matplotlib: Visualización de datos e imágenes (ej: graficar histogramas o mostrar resultados de filtrado).

  • OpenCV: Implementación de algoritmos de visión artificial (ej: detección de bordes, umbralización, segmentación).



6. Histograma en imágenes médicas

Gráfico que representa la distribución de frecuencias de los niveles de intensidad (��rk) en una imagen. Matemáticamente, se define como ℎ(��)=��h(rk)=nk, donde ��nk es el número de píxeles con intensidad ��rk. Su normalización (�(��)=���P(rk)=nnk) permite analizar propiedades estadísticas como media, desviación estándar y bimodalidad, cruciales para evaluar contraste y detectar anomalías.



7. Preprocesado

Conjunto de técnicas aplicadas antes del análisis principal para optimizar la imagen. Incluye:

  • Reducción de ruido (filtrado Gaussiano o mediana).

  • Corrección de iluminación (ecualización del histograma).

  • Realce de contraste (transformaciones de intensidad).

  • Normalización (ajuste de rango dinámico).



8. Dominio espacial vs. frecuencial

Dominio EspacialDominio Frecuencial
Opera directamente sobre píxeles.Usa transformadas (ej: Fourier).
Técnicas: filtros de suavizado, umbralización.Técnicas: análisis de frecuencias, filtrado pasa-banda.
Ejemplo: convolución con kernels.Ejemplo: eliminación de ruido periódico.


9. Ruido en imágenes médicas

Información indeseada que degrada la calidad, originada durante la adquisición (ej: interferencias en RMN), transmisión (errores de compresión) o procesamiento (artefactos). Tipos comunes:

  • Gaussiano: Distribución normal (típico en sensores).

  • Sal y pimienta: Píxeles blancos/negros aleatorios (fallos en transmisión).

  • Speckle: Granulado en ultrasonidos.



10. Umbralización

Método de segmentación que convierte una imagen en escala de grises a binaria (blanco/negro) aplicando un umbral (T). Clasifica píxeles como:

Si �(�,�)>�→Blanco (255),Si no →Negro (0).Si I(x,y)>TBlanco (255),Si no Negro (0).

Usado para aislar estructuras anatómicas en imágenes médicas.




11. Tabla comparativa: Umbralización Simple, Otsu y Adaptativa

VariableUmbralización SimpleOtsuAdaptativa
Base de cálculoUmbral global definido por el usuario.Análisis bimodal del histograma.Umbral local basado en vecindad.
Precisión en bordesBaja (no considera variaciones locales).Media (depende de bimodalidad).Alta (ajuste local).
Manejo de ruidoSensible a ruido.Requiere preprocesado para ruido.Robustez media/alta según método.
Uso en imágenes médicasImágenes con iluminación uniforme.Imágenes bimodales (ej: TAC).Imágenes con iluminación no uniforme.
Aplicaciones médicasDetección de fracturas en radiografías.Segmentación de tumores.Ecografías o imágenes con sombras.
LimitacionesNo adaptable a variaciones locales.Ineficaz en histogramas multimodales.Costo computacional (Gaussian_C).



Fuentes: Contenido de los archivos "01 Unidad 1 - PARTE 1.pdf", "01 Unidad 1 - PARTE 2.pdf", y "02 Unidad 2.pdf".



Friday.

Consectetuer adipiscing elit leget odiogil voluptatum similique. 


  • Fugit voluptates dolor. 
  • Libero assumenda.
  • Assumenda Voluptates.

Saturday.

Adipisci reiciendis accusantium voluptatibus id voluptate tempore dolor harum nisi amet!


  • Fugit voluptates dolor. 
  • Libero assumenda.
  • Assumenda Voluptates.
  • Nobis, eaque.
 

Words of the designer.

Lorem ipsum dolor sitope amet, consectetur adipisicing elitip.

Location.

Lorem ipsum dolor sitope amet, consectetur adipisicing elitip. Massumenda, dolore!