¿Cómo funciona el auto enfoque en las cámaras?
- publicado por Ing. Jesús Martínez
- Fecha junio 2, 2023
Contenido
Introducción:
¿Alguna vez has notado cómo tu smartphone automáticamente cambia el enfoque de la cámara cuando intentas tomar una fotografía? Esto se conoce como autofocus y está presente en una amplia gama de cámaras, desde smartphones hasta cámaras profesionales. Su objetivo es ofrecerte la mejor toma posible sin demasiado esfuerzo. Pero, ¿alguna vez te has preguntado cómo sabe exactamente el software de tu cámara si una imagen está enfocada o no?
Si reflexionamos sobre ello, podemos pensar que es algo difícil de lograr, ya que para nosotros, como humanos, es fácil discernir si una imagen está enfocada o desenfocada, gracias a nuestro conocimiento del concepto de enfoque. Sin embargo, ¿cómo puede una máquina hacerlo? En este artículo, vamos a mostrarte de forma sencilla cómo una cámara, en este caso una máquina, puede determinar si una imagen está enfocada o desenfocada.
El Laplaciano:
Hablemos un poco sobre el Laplaciano, una técnica de procesamiento de imágenes que nos permite calcular cambios bruscos de intensidad en los píxeles de una imagen. Esto se logra mediante una convolución que calcula la diferencia entre los valores de los píxeles vecinos y el valor del píxel central en una región de la imagen. Desde una perspectiva matemática, el operador Laplaciano se define como la suma de las segundas derivadas parciales de una función en dos dimensiones y nos ayuda a detectar bordes y características de alto contraste en la imagen.
Ahora, centrémonos en la nitidez. La nitidez está estrechamente relacionada con la claridad y definición de los detalles en una imagen. Una imagen nítida se caracteriza por tener bordes y detalles bien definidos, lo que nos permite apreciar con precisión los elementos presentes en ella. Por otro lado, una imagen borrosa o poco nítida se refiere a aquella con bordes difusos y detalles poco definidos.
Hasta aquí, ¿no crees que todo comienza a cobrar sentido? Si una imagen nítida implica bordes bien definidos, que son cambios bruscos de intensidad, y sabemos que podemos cuantificar estos cambios mediante el uso del Laplaciano, entonces podemos emplear el Laplaciano para determinar si una toma está enfocada o no. ¿No te parece una idea interesante?
Programando nuestro algoritmo de evaluación de enfoque:
Comenzaremos con la importación de la librería OpenCV
import cv2 #importamos OpenCV
Ahora vamos a crear una variable en la cual almacenaremos la ruta de la imagen con la cual trabajaremos y posteriormente utilizaremos cv2.imread()
para leer el contenido de la imagen.
imagen = "1.jpg"
img = cv2.imread(imagen) #leemos la imagen
Creamos una función en la cual calcularemos el laplaciano en la imagen, esto lo realizaremos mediante cv2.Laplacian()
que nos solicita una imagen en escala de grises y el tipo de dato que se manejará, en este caso una matriz de punto flotante de 64 bits, por lo tanto, nuestra función quedará de la siguiente manera. (Esta función debe de ir sobre la definición de la variable imagen)
def calcularMedidaFocal(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convertimos la imagen a gray scale
# calculamos la puntuación de la medida focal
imgL = cv2.Laplacian(gray, cv2.CV_64F)
mF = imgL.var()
return mF, imgL
Ahora debemos mandar llamar la función para obtener la puntuación
medidaFocal, imgL = calcularMedidaFocal(img)
print(medidaFocal)
Evaluamos si se trata de una toma enfocada o no enfocada y mostramos el resultado en la imagen analizada
if medidaFocal> 150:
estado= "Enfocada"
color = (0, 255, 0)
else:
estado= "No enfocada"
color = (0, 0, 255)
img= cv2.putText(img, "{}".format(estado), (50,50), cv2.FONT_HERSHEY_SIMPLEX,
fontScale= 1, color=color, thickness = 2, lineType=cv2.LINE_AA)
cv2.imshow("output",img)
cv2.imshow("output2",imgL)
cv2.waitKey(0)
cv2.destroyAllWindows()
Por lo tanto, el código nos quedaría de la siguiente manera
import cv2 #importamos OpenCV
def calcularMedidaFocal(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convertimos la imagen a gray scale
# calculamos la puntuación de la medida focal
imgL = cv2.Laplacian(gray, cv2.CV_64F)
mF = imgL.var()
return mF, imgL
imagen = "1.jpg"
img = cv2.imread(imagen) #leemos la imagen
medidaFocal, imgL = calcularMedidaFocal(img)
print(medidaFocal)
if medidaFocal> 150:
estado= "Enfocada"
color = (0, 255, 0)
else:
estado= "No enfocada"
color = (0, 0, 255)
img= cv2.putText(img, "{}".format(estado), (50,50), cv2.FONT_HERSHEY_SIMPLEX,
fontScale= 1, color=color, thickness = 2, lineType=cv2.LINE_AA)
cv2.imshow("output",img)
cv2.imshow("output2",imgL)
cv2.waitKey(0)
cv2.destroyAllWindows()
Resultados:
Al utilizar la técnica del Laplaciano para evaluar la nitidez de una imagen, se pudo determinar si una toma se encontraba enfocada o no. Al aplicar el operador Laplaciano, se calcularon los cambios bruscos de intensidad en los píxeles de la imagen. Los resultados mostraron que las imágenes nítidas presentaban bordes bien definidos, con cambios intensos en la intensidad de los píxeles. Por otro lado, las imágenes borrosas o poco nítidas revelaron bordes difusos y cambios de intensidad suaves.
Estos resultados demuestran la utilidad del operador Laplaciano para verificar el enfoque de una imagen. Al detectar bordes y características de alto contraste, el Laplaciano permite determinar si una imagen tiene detalles definidos y bordes nítidos, lo que indica un buen enfoque. Esta información resulta valiosa para evaluar la calidad de las fotografías y garantizar imágenes claras y definidas.
Conclusión:
En conclusión, hemos explorado cómo una cámara puede distinguir entre una imagen borrosa y una nítida utilizando el operador Laplaciano. Esto nos ha brindado una comprensión más profunda de cómo funcionan los algoritmos de autofocus en las cámaras.
Ahora, imagina llevar este mismo concepto a una cámara en la que puedas controlar manualmente el enfoque del objetivo. ¿No crees que sería relativamente sencillo agregar un algoritmo de autofocus? Parece una tarea factible. Me encantaría conocer tus ideas en los comentarios sobre cómo y dónde aplicarías este excelente algoritmo y cómo te beneficiaría.
Soy un apasionado por la innovación tecnológica, el desarrollo y el emprendimiento. Durante mi educación superior me enfoqué en la programación de software para visión artificial e inteligencia artificial. Poco después al graduarme tuve la oportunidad de aplicar estos conocimientos en el desarrollo de soluciones para empresas como General Motors, Ford, Harley-Davidson, Mack, Tesla y unas cuantas empresas más del ramo automotriz.