Binarizar imagen Java
Summary
TLDREl video ofrece una explicación detallada sobre cómo binarizar una imagen, un proceso esencial en el procesamiento de imágenes que se utiliza en Inteligencia Artificial. El presentador, Lester Meneces, comparte su conocimiento adquirido a través de extensas investigaciones y explica que la binarización consiste en reducir la información de una imagen a dos valores: cero (negro) y 255 (blanco). Para ello, utilizamos la clase BufferedImage y métodos como getRGB y setRGB para manipular los píxeles. Además, se discute la importancia de definir un ancho y alto máximo para las imágenes para optimizar el rendimiento en proyectos que involucran redes neuronales. El vídeo incluye un ejemplo práctico de cómo binarizar una imagen de Superman, mostrando cómo el resultado varía con diferentes valores umbral.
Takeaways
- 📚 Binarización es una técnica de procesamiento de imágenes que reduce la información de una imagen a dos valores: cero (negro) y 255 (blanco).
- 🔍 El proceso de binarización es útil en Inteligencia Artificial, especialmente cuando se trata de procesar imágenes para tareas como el seguimiento de un camino por un carrito.
- 🖼️ Para trabajar con imágenes, es necesario redimensionar y luego binarizar la imagen para reducir la información a lo esencial.
- 📏 Se utilizan variables estáticas finales para definir el ancho y el alto máximo permitidos de una imagen, lo que ayuda a controlar el rendimiento del procesamiento.
- 💾 Una imagen se puede representar como una matriz de píxeles, donde cada píxel tiene un valor de color compuesto por los componentes rojo, verde y azul (RGB).
- 🔢 El método `getRGB` se utiliza para obtener el valor del color de un píxel en una posición específica de la imagen.
- 🎨 El umbral de binarización es el límite que determina si un píxel será considerado negro o blanco. Un valor umbral más alto puede resultar en una imagen más oscura (más negros), mientras que un valor umbral más bajo dará una imagen más clara (más blancos).
- 🔄 Para binarizar una imagen, se calcula el promedio de los colores de cada píxel y se compara con el umbral; si es mayor, el píxel es blanco, de lo contrario es negro.
- ➡️ Después de binarizar la imagen, es necesario convertir la matriz de colores de regreso en una imagen利用`BufferedImage` y el método `setRGB`.
- 🖥️ La clase `BufferedImage` y el método `ImageIO.write` se utilizan para guardar y escribir la imagen binarizada en un archivo.
- 📉 El rendimiento del procesamiento de imágenes puede verse afectado por el tamaño de la imagen; por ello, se recomienda restringir el ancho y el alto a valores máximos permitidos para mejorar el rendimiento.
Q & A
¿Qué es la binarización en el procesamiento de imágenes?
-La binarización es una técnica del procesamiento de imágenes que consiste en reducir la información de una imagen digital a dos valores: cero, que representa el negro, y 255, que representa el blanco.
¿Por qué es importante binarizar una imagen en el contexto de Inteligencia Artificial?
-La binarización es importante en Inteligencia Artificial porque permite reducir a lo más básico la información de una imagen, lo que es útil para procesar imágenes de manera eficiente en tareas como el seguimiento de un camino por parte de un carrito, por ejemplo.
¿Cuál es el propósito de las variables estáticas en el código?
-Las variables estáticas en el código son aquellas que mantienen el mismo valor en todo el programa y en todas las instancias de la variable. Esto significa que el espacio asignado en memoria para la variable es único y su valor no puede ser modificado después de su inicialización.
¿Cómo se carga una imagen en la clase para procesarla?
-Para cargar una imagen en la clase, se utiliza el constructor de la clase, el cual recibe un String que representa la ruta del archivo de la imagen. Luego, se utiliza la clase BufferedImage y el método 'getImage' de la clase ImageIO para decodificar y cargar la imagen en una variable de tipo BufferedImage.
¿Cómo se determina si una imagen debe ser restringida por su tamaño en el procesamiento?
-Se determina si una imagen debe ser restringida por su tamaño comparando su ancho y alto con los valores máximos permitidos definidos en el código. Si el ancho o el alto de la imagen excede estos valores, la imagen se restringe al ancho o alto permitido, lo que puede resultar en una pérdida de información.
¿Cómo se convierte cada píxel de una imagen en un valor del arreglo de colores?
-Para convertir cada píxel de una imagen en un valor del arreglo de colores, se utilizan dos ciclos para recorrer filas y columnas de la imagen. Se llama al método 'getRGB' para obtener el valor del color del píxel en una posición específica y se asigna ese valor al arreglo de colores correspondiente.
¿Qué es el método 'getRGB' y para qué sirve?
-El método 'getRGB' se utiliza para obtener el valor del color del píxel en una posición específica de la imagen. Retorna el valor del color en un valor entero que representa la combinación de los colores rojo, verde y azul (RGB).
¿Cómo se realiza el proceso de binarización de una imagen?
-El proceso de binarización de una imagen consiste en comparar cada píxel de la imagen con un umbral determinado. Si el valor del píxel es más claro que el umbral, se considera como blanco; de lo contrario, se considera como negro. Esto se hace calculando el promedio de los valores de color de cada píxel y comparándolo con el umbral.
¿Cómo se imprime una imagen binarizada?
-Para imprimir una imagen binarizada, se utiliza la clase BufferedImage nuevamente, creando una nueva instancia con el ancho y el alto de la imagen. Luego, se utiliza un ciclo para recorrer la matriz de colores y el método 'setRGB' para asignar los valores de color a cada píxel de la nueva imagen. Finalmente, se utiliza la clase ImageIO y su método 'write' para escribir y guardar la imagen binarizada.
¿Cómo afecta el valor del umbral la calidad de la binarización de una imagen?
-El valor del umbral afecta directamente la calidad de la binarización. Un valor de umbral demasiado alto puede resultar en una imagen predominantemente negra, mientras que un valor demasiado bajo puede hacer que la imagen sea predominantemente blanca. Es importante encontrar un valor intermedio que permita una transición clara entre los colores negros y blancos.
¿Por qué es necesario guardar el ancho y el alto de la imagen original?
-Es necesario guardar el ancho y el alto de la imagen original para poder crear una nueva imagen de salida con las mismas dimensiones después del proceso de binarización. Esto asegura que la imagen binarizada tenga la misma resolución que la original.
Outlines
😀 Introducción a la binarización de imágenes
El primer párrafo introduce el tema de la binarización de imágenes, una técnica de procesamiento de imágenes que reduce la información a dos valores: negro (0) y blanco (255). El objetivo es preparar imágenes para su procesamiento en inteligencia artificial, como en el caso de un carrito que sigue un camino. Se menciona que el código para realizar la binarización está disponible en la descripción del video y se ofrece una explicación detallada del proceso.
🖼️ Procesamiento de imágenes y limitación de tamaño
Este párrafo se enfoca en la preparación de la imagen antes de la binarización. Se describe cómo se carga una imagen en la clase y se establecen límites máximos para el ancho y la altura de la imagen para optimizar el rendimiento del procesamiento. Se utiliza la clase `BufferedImage` para manejar la imagen y se explica el uso de variables estáticas y finales para definir estas limitaciones.
🔄 Conversión de píxeles a valores numéricos
En este párrafo, se aborda cómo convertir cada píxel de la imagen en un valor numérico utilizando dos ciclos para recorrer filas y columnas. Se utiliza el método `getRGB` para obtener el valor del color de cada píxel, el cual se almacena en una matriz. Se destaca la importancia de comprender el modelo de color RGB y cómo se relaciona con los valores numéricos de los píxeles.
📈 Binarización y selección de umbral
El proceso de binarización se describe en detalle en este párrafo. Se compara cada píxel de la imagen con un umbral para determinar si es negro o blanco. Se calcula el promedio de los valores de color de cada píxel y se decide su clasificación en función de si supera el umbral. Luego, se explica cómo imprimir la imagen binarizada utilizando la clase `BufferedImage` y el método `setRGB` para asignar los valores de color.
Mindmap
Keywords
💡binarizar
💡procesamiento de imágenes
💡umbral
💡red neuronal
💡buffer image
💡getRGB y setRGB
💡clase ImageIO
💡método constructor
💡variables estáticas y finales
💡matriz de colores
Highlights
Lester Meneces introduce el tema de binarizar una imagen, un proceso importante en el procesamiento de imágenes.
El binarización es una técnica que reduce la información de una imagen a dos valores: negro y blanco.
Se menciona la importancia de la binarización en el contexto de un curso de Inteligencia Artificial y su aplicación en un proyecto de seguimiento de carretes.
Se destaca la necesidad de redimensionar una imagen antes de binarizarla para procesarla de manera eficiente.
Se describe la estructura de la clase Imagen, donde se cargan y manipulan las imágenes.
Se explica el uso de variables estáticas para definir el ancho y el alto máximos permitidos de una imagen en el proyecto.
Se discute la importancia del rendimiento en la computadora y cómo las imágenes grandes afectan negativamente el mismo.
Se introduce el concepto de 'final' en programación, que asegura que una variable tenga un valor constante a lo largo del programa.
Se describe cómo se carga una imagen en la clase Imagen utilizando la clase BufferedImage y la clase ImageIO.
Se detalla el proceso de restringir el tamaño de una imagen si este excede los límites permitidos.
Se explica cómo convertir cada píxel de la imagen en una posición del arreglo de colores utilizando métodos de la clase Color.
Se menciona el uso del método 'getRGB' para obtener el valor del color de un píxel en una posición específica.
Se describe el proceso de binarización, que implica comparar cada píxel con un umbral determinado para asignarle un valor de negro o blanco.
Se discute la importancia de encontrar un valor intermedio para el umbral en la binarización para obtener resultados precisos.
Se muestra cómo imprimir la imagen binarizada utilizando la clase BufferedImage y el método 'setRGB'.
Se menciona el uso del método 'write' de la clase ImageIO para guardar la imagen binarizada en un archivo.
Se ilustra cómo el valor del umbral afecta la cantidad de negro o blanco en la imagen binarizada.
Se concluye la sesión con una demostración de la imagen binarizada y cómo cambiar el umbral afecta el resultado final.
Transcripts
Hola bienvenidos amigos e Mi nombre es
Lester meneces y hoy quiero enseñarles
Cómo binarizar una imagen siempre como
les he mencionado uno Busca busca y hay
que indagar muchísimo para poder
encontrar las respuestas que uno quiere
eh ahora para los que quieran el código
rápido y anden ahí necesitados el código
está en la descripción pueden
descargarlo es el mismo no se hace
ninguna modificación ni nada y eh Para
los que no para los que quieran aprender
eh les voy a explicar eh una
binarización la binarización es una
técnica del procesamiento de imágenes
que consiste en un tal vez en un proceso
de reducción de la información de una
imagen digital a dos valores cero que
representa el negro y 255 que representa
el blanco ahora por qué estoy haciendo
todo esto Pues todos los tutoriales
hasta ahora los el anterior redimensión
y este que es binarización tiene que ver
ver con un curso que que se llama
Inteligencia artificial Entonces
teníamos que hacer que un carrito se
moviera y que siguiera un camino y
Entonces teníamos que estar procesando
imágenes sí Entonces para eso me servía
tengo que se tiene que redimensionar una
imagen luego binarizar se para ir
reduciendo a lo más básico la
información de una imagen que nosotros
eh queremos procesar ahora
Comencemos s seguimos trabajando en la
misma clase imagen donde trabajamos la
clase redimensionar Acá está pero ahora
le hicimos ciertas
modificaciones les comentaba de que
en que en el anterior tutorial en la
redimensión lo único que íbamos a tener
era un un método pero ahora nuestro
constructor cambió ahora vamos a
procesar la imagen en la clase y por eso
tenemos que cargar la imagen a la clase
a nuestro proyecto
ahora acá tenemos eh hicimos algunas
agregamos algunas variables porque
siempre pienso que es más fácil que yo
les explique el código a que los esté
escribiendo y ahí se pierda un poco de
tiempo porque a veces hay errores y así
Ahora Comencemos explicando Qué vamos a
hacer necesitamos dos variables eh de
tipo
e dos variables que nos definan lo
máximo permitido de una imagen en su
ancho y su alto eh como algo un punto
importante este código no lo pensé yo
sino que de todo lo que investigué de
todo lo que pude encontrar jalé lo más
importante lo entendí para poder
explicárselo Entonces no este código no
es totalmente mío algunas partes sí
otras no entonces declaramos dos anchos
y dos altos permitidos por qué Porque
hay imágenes que pueden ser muy grandes
pero cuando se está haciendo el
procesamiento de una imagen
eh Y en este caso en mi proyecto
teníamos que tener una red neuronal
trabajando era eh muy necesitábamos
mucho e rendimiento en la computadora el
rendimiento Tenía que estar al máximo y
mientras más grande sea una imagen más e
más bajo es el rendimiento del
procesamiento Bueno ahora para los
programadores
e tal vez
Juniors Qué significa que una variable
sea estática pues significa que la
variable va a ser la misma en todo el en
todo el programa en todas las instancias
de la variable eh Para todos los objetos
la variable siempre va a tener el mismo
valor va a ser única el espacio que se
le asigna en memoria va a ser un único
espacio Qué significa
eh que sea final final significa que el
valor que yo le estoy asignando en este
momento que sería 1024 este valor puede
variar dependiendo Lo que ustedes
quieran verdad pero este valor no va a
poder ser modificado Ese es el valor que
va a tener y así se queda hasta que
finalice dice
eh Hasta que finalice el programa Y así
va a ser un ancho y un alto permitido Sí
para restringir el límite Y por qué
necesitamos eso porque nuestra imagen la
vamos a traducir o la vamos a convertir
a un arreglo de colores a un arreglo de
píxeles imagínense cuando ustedes van a
descargar una imagen o Quieren poner una
imagen en su escritorio y la imagen es
de es de
1280 X 720 Qué significa eso que tiene
12 1280 píxeles de ancho y 720 de alto
Eso es lo que significa o o hasta eso es
lo que yo he entendido
e ahora y por eso vamos a toda la imagen
imagínense que cada posición de la
imagen o cada Pixel de la imagen va a
estar guardado en un arreglo que se en
sí es una matriz el nombre es
indiferente Pero va a ser una nuestra
matriz un arreglo de colores en sí
tenemos dos variables enteras un ancho y
un alto que nos van a servir más
adelante y ahora qué pasa en el
constructor porque lo primero que
hacemos nosotros es llamar instanciar un
objeto y le enviamos a su constructor la
imagen que va a ser la que vamos a
procesar el constructor va a recibir un
un String que va a ser la ruta del
archivo en dónde está guardado el
archivo en este caso como yo la tengo en
mi en la carpeta principal o sea el
directorio raíz del proyecto Pues no le
pongo así como c dos puntos sino que
nada más el nombre de la imagen
ahora
inicializar un arreglo de colores si se
dan cuenta para poder entrar a una
imagen y obtener el valor del Pixel
necesit podemos utilizar la clase color
Sí y vamos a hacer una matriz cuadrada
del ancho por el ancho Sí luego van a
entender por qué ahora llamamos a un
método llamado cargar imagen y le
enviamos la ruta del archivo terminamos
con la primera parte carguemos el
archivo como habíamos hecho en
redimensionar una imagen vamos a hacer
uso de la clase buffer image que ustedes
ya saben que la clase buffer image es
una clase que extiende de la clase image
y así hereda todo el funcionamiento de
la clase Sí y esta clase image describe
el funcionamiento de una imagen eso es
lo que hace de amos una variable tipo
buffer image que nos va a ayudar a poder
eh
leer la imagen así vamos a leer la
imagen haciendo uso de la clase estática
image io lo que hace es decodificar la
imagen en el formato que sea jpg o png o
el que ustedes gusten y la traduce a una
variable de buffer image Sí eso también
está en el tutorial anterior Ahora aquí
viene eh el uso o la utilidad que le
vamos a dar al ancho permitido y al
ancho y aquí lo que decimos es de que si
nuestra imagen nuestra imagen Ya ahora
ya es bf si nuestra imagen eh el ancho
de nuestra imagen es menor al ancho
permitido Está bien entonces el ancho eh
que vamos a utilizar en toda la clase
para hacer los los procesos va a ser el
mismo ancho de la imagen Sí ahora si no
fuera así si el ancho excede el ancho
permitido a la imagen se le restringe y
se le eh asigna el ancho permitido esto
lo esto si la imagen Es muy grande lo
que va a pasar es de que puede va a
perder como que solo una parte de la
imagen se va a procesar como que si
recortáramos la imagen y solo lo que
podemos procesar eh se va a guardar
dentro de la matriz y lo mismo se hace
con el alto lo mismo es la misma lógica
este contador háganle caso miso porque
nada más me va a servir para poder
enseñarles eh lo que viene a
continuación ahora tenemos el buffer
image Y tenemos la imagen ahora tenemos
que convertir esa imagen o pasar cada
píxel de la imagen a una posición del
arreglo de colores por eso es que
necesitamos dos ciclos para recorrer
filas y columnas filas y columnas aquí
va a ser el alto y el ancho Sí y lo que
decimos es que nuestro arreglo de
colores en la posición i j Ahí va a ser
0,0 0,1 0,2 vamos a asignarle un nuevo
color y ahora Aquí vamos a hacer el uso
de un método llamado get rgb y Para qué
funciona el método get rgb lo que hace
aquí es que retorna el valor del color
del pixxel en la posición eh J com y en
la posición de la de la
imagen y lo retorna en un valor entero
ahorita les enseño cómo y para eso vamos
a correr la imagen el programa antes de
tiempo y acá si se dan cuenta utilizo el
contador para decir En qué posición
estoy eh jalando el valor rgb y rgb para
quienes eh aún no lo saben yo esto no lo
sabía antes eh significa Red Green y
Blue son los son los colores es la es
una un píxeles esa combinación de
colores entonces vean corramos el
programa y Acá está vamos a detenerlo
porque no necesitamos mucha información
en la posición
11720 de nuestra imagen el valor rojo
azul rojo verde y azul nos nos tira este
valor este valor entero en este valor
están los tres colores Sí y eso es lo
que nosotros tenemos que hacer
eh pasar el color del pixxel a un valor
entero y ese valor del color se va a
asignar al arreglo entonces volvamos
vamos a comentar esto porque si no se
tarda mucho y eso es lo que pasa cuando
cargamos la imagen ahora que ya tenemos
la imagen cargada en una matriz podemos
procesar o binarizar la imagen como
quieran llamarle porque el proceso de
binarización lo que tiene que hacer es
que consiste en comparar cada píxel de
la imagen con un determinado umbral
ahora el umbral que es este valor de
umbral el valor de umbral es el límite
es decir por ejemplo este píxel es muy
oscuro entonces eh es un cero significa
negro o este píxel es muy claro entonces
significa un blanco Acá lo que hace es
lo mismo recorrer una la matriz de
colores declaramos una variable de tipo
color para poder acc acceder a las
propiedades de esa matriz y hacemos un
promedio un promedio del color azul rojo
y verde y lo dividimos dentro tres es
simplemente un promedio decir ese
promedio se pasa es más grande que el
umbral sí es más grande que el umbral
Entonces es blanco si no es negro Sí y
eso es en sí la binarización ahora
Necesitamos eh eh imprimir la imagen
porque la imagen en sí está ahorita en
una matriz de colores tenemos que hacer
el proceso inverso de cargarla para eso
vamos a volver a utilizar el la clase
buffer image en una con una variable y
le vamos a asignar el ancho y el alto de
la imagen por eso importante guardarlo
para poder devolver una nueva imagen y
eh eh tomamos un el tipo del buffer que
va a ser un valor entero en rgb para
poder asignarle aquí en asignarle el
otra vez los valores en rgb y que estos
puedan ser traducidos nuevamente en un
Pixel entonces en esta salida en su
antes teníamos un get rgb y ahora
tenemos un set rgb ponemos la posición
en donde queremos asignar
el esos valores y e la matriz luego
retornamos la salida que sería un wofer
image y ya podemos imprimir la imagen
normal entonces eh regresemos a nuestro
método Main declaramos un obj instanci
un objeto lo declaramos como ustedes
quieran llamarle eh
e mandamos la imagen como parámetro y
acá está esta eh este valor de umbral
Mientras más grande sea el valor de de
umbral más exacto o más inexacto más
bien Perdón más inexacto va a ser
esa esa conversión decir este es negro
este es blanco este es negro este es
blanco sí entonces tiene que haber un
valor intermedio luego eh esto Esta
línea lo único para que nos sirve es
para poder volver a imprimir la imagen y
si se recuerdan en el método imprimir
imagen devolvemos un buffer image por lo
que si lo guardamos en otro buffer image
pues no hay ningún problema nuevamente
usamos la clase estática image io con su
método Wi para poder escribir la salida
Entonces corramos el programa y veamos
Cuáles son las Cuál es el resultado de
esto de momento está corriendo y esta es
nuestra entrada Sí nuestra entrada es
este esta imagen de Superman y esta es
nuestra
salida Entonces si se pueden dar cuenta
ahí lo tenemos imagen normal imagen
binarizar blancos y
negros vamos a cambiar el valor de la
función
umbral y se darán cuenta cómo es que va
a variar Por ejemplo si acá Nosotros le
queremos poner
200 ahora la imagen está casi negra
porque los valores eran de puede que
sean demasiado oscuros Entonces se
traducen a un negro sí
cambiémoslo
50 y vean Qué sucede nuevamente tenemos
la imagen y ahora la imagen es más
blanco que negro Entonces por eso les
decía tienen que encontrar un valor
intermedio nuevamente con
100 corremos el programa y vemos nuestra
salida y ahora sí Ese es el valor
intermedio pueden variando espero a
verlos ayudado y nos vemos en una
próxima
Посмотреть больше похожих видео
IMAGEN A ESCALA DE GRISES EN JAVA
Como crear tu propio DETECTOR DE OBJETOS en TIEMPO REAL con Python OpenCV | Template Matching
CUENTAS DE ORDEN | Registro Contable | Contabilidad básica | Contador Contado
Redes Neuronales RECURRENTES (RNN) explicación
¿Cómo representa el conocimiento tu cerebro ? - Representaciones Mentales
Robótica Industrial | Laboratorio 4 Funciones para determinar características geométricas de objetos
5.0 / 5 (0 votes)