Cambiar el nivel de brillo y contraste de cualquier imagen es lo más básico que todos hacen con una imagen. Está destinado a cambiar el valor de todos y cada uno de los píxeles de una imagen; se puede hacer multiplicando o dividiendo el valor de los píxeles de una imagen. En este artículo, veremos cómo podemos implementar nuestra teoría en un hermoso código usando OpenCV Python,
Antes de comenzar, intentemos comprender algunos conceptos básicos como, ¿qué es el brillo? ¿Qué es un contraste? ¿Qué son los píxeles? ¿Y qué es OpenCV?
- Brillo: cuando se ajusta el brillo, la gama completa de tonos dentro de la imagen aumenta o disminuye según corresponda.
- Contraste: Cuando se sube el ajuste de contraste, se eliminan los tonos medios. La imagen tendrá un mayor porcentaje de tonos oscuros o blancos y negros o luces con un tono medio mínimo.
- Píxeles: los píxeles se usan normalmente para referirse a la resolución de visualización de un monitor o pantalla de computadora. Cuanto mayores sean los píxeles, mayor será el detalle de la imagen.
- OpenCV: OpenCV es la enorme biblioteca de código abierto para visión por computadora, aprendizaje automático y procesamiento de imágenes y ahora juega un papel importante en la operación en tiempo real.
Temario: Para aprender a ajustar el nivel de brillo y contraste de una imagen usando OpenCV.
Requisito: OpenCV
Instalación:
pip install openCV
Acercarse:
- Importar módulo requerido.
- Defina la función principal, defina los datos requeridos en ella.
- Cree una función brillo_contraste, para crear una barra de seguimiento para ajustar el brillo y el contraste.
- Crea otra función para cambiar el brillo y el contraste.
- Muestre la imagen original y editada.
- Finalice el programa con ‘ESC’ o simplemente cierre la ventana.
Implementemos esto paso a paso:
Paso 1: Aquí cargaremos una imagen y crearemos una barra de seguimiento.
Sintaxis: imread(nombre de archivo): nombre de archivo(Nombre del archivo de imagen).
namedWindow(winname): winname(Nombre de la ventana).
Código:
Python3
if __name__ == '__main__': # The function imread loads an # image from the specified file and returns it. original = cv2.imread("pic.jpeg") # Making another copy of an image. img = original.copy() # The function namedWindow creates # a window that can be used as # a placeholder for images. cv2.namedWindow('GEEK') # The function imshow displays # an image in the specified window. cv2.imshow('GEEK', original) # createTrackbar(trackbarName, # windowName, value, count, onChange) # Brightness range -255 to 255 cv2.createTrackbar('Brightness', 'GEEK', 255, 2 * 255, BrightnessContrast) # Contrast range -127 to 127 cv2.createTrackbar('Contrast', 'GEEK', 127, 2 * 127, BrightnessContrast) BrightnessContrast(0) # The function waitKey waits for # a key event infinitely or for # delay milliseconds, when it is positive. cv2.waitKey(0)
Paso 2: al llamar a la función del controlador, devolverá la imagen editada. Después de eso, la función imshow() mostrará la imagen afectada.
Sintaxis: getTrackbarPos(trackbarname, winname): trackbarname(Nombre de la barra de seguimiento), winname(Nombre de la ventana)
Código:
Python3
def BrightnessContrast(brightness=0): # getTrackbarPos returns the # current position of the specified trackbar. brightness = cv2.getTrackbarPos('Brightness', 'GEEK') contrast = cv2.getTrackbarPos('Contrast', 'GEEK') effect = controller(img, brightness, contrast) # The function imshow displays # an image in the specified window cv2.imshow('Effect', effect)
Paso 3: la función del controlador controlará el brillo y el contraste de una imagen de acuerdo con la posición de la barra de seguimiento y devolverá la imagen editada.
Sintaxis: addWeighted(src1, alpha, src2, beta, gamma)
Parámetros:
src1: primera array de entrada.
alfa: (peso de los primeros elementos del arreglo.
src2: segundo arreglo de entrada del mismo tamaño y número de canal que src1.
beta: peso de los segundos elementos del arreglo.
gamma: escalar agregado a cada suma.putText(img, texto, org, fontFace, fontScale, color, grosor, lineType, bottomLeftOrigin)
img: Imagen.
text: String de texto a dibujar.
org: esquina inferior izquierda de la string de texto en la imagen.
fontFace: tipo de fuente, consulte #HersheyFonts.
fontScale: factor de escala de fuente que se multiplica por el tamaño base específico de la fuente.
color: color del texto.
grosor: Grosor de las líneas utilizadas para dibujar un texto.
l ineType: Tipo de línea. Consulte #Tipos de línea.
bottomLeftOrigin: cuando es verdadero, el origen de los datos de la imagen se encuentra en la esquina inferior izquierda. De lo contrario, está en la esquina superior izquierda.
Python3
def controller(img, brightness=255, contrast=127): brightness = int((brightness - 0) * (255 - (-255)) / (510 - 0) + (-255)) contrast = int((contrast - 0) * (127 - (-127)) / (254 - 0) + (-127)) if brightness != 0: if brightness > 0: shadow = brightness max = 255 else: shadow = 0 max = 255 + brightness al_pha = (max - shadow) / 255 ga_mma = shadow # The function addWeighted # calculates the weighted sum # of two arrays cal = cv2.addWeighted(img, al_pha, img, 0, ga_mma) else: cal = img if contrast != 0: Alpha = float(131 * (contrast + 127)) / (127 * (131 - contrast)) Gamma = 127 * (1 - Alpha) # The function addWeighted calculates # the weighted sum of two arrays cal = cv2.addWeighted(cal, Alpha, cal, 0, Gamma) # putText renders the specified # text string in the image. cv2.putText(cal, 'B:{},C:{}'.format(brightness, contrast), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) return cal
A continuación se muestra la implementación completa:
Python3
import cv2 def BrightnessContrast(brightness=0): # getTrackbarPos returns the current # position of the specified trackbar. brightness = cv2.getTrackbarPos('Brightness', 'GEEK') contrast = cv2.getTrackbarPos('Contrast', 'GEEK') effect = controller(img, brightness, contrast) # The function imshow displays an image # in the specified window cv2.imshow('Effect', effect) def controller(img, brightness=255, contrast=127): brightness = int((brightness - 0) * (255 - (-255)) / (510 - 0) + (-255)) contrast = int((contrast - 0) * (127 - (-127)) / (254 - 0) + (-127)) if brightness != 0: if brightness > 0: shadow = brightness max = 255 else: shadow = 0 max = 255 + brightness al_pha = (max - shadow) / 255 ga_mma = shadow # The function addWeighted calculates # the weighted sum of two arrays cal = cv2.addWeighted(img, al_pha, img, 0, ga_mma) else: cal = img if contrast != 0: Alpha = float(131 * (contrast + 127)) / (127 * (131 - contrast)) Gamma = 127 * (1 - Alpha) # The function addWeighted calculates # the weighted sum of two arrays cal = cv2.addWeighted(cal, Alpha, cal, 0, Gamma) # putText renders the specified text string in the image. cv2.putText(cal, 'B:{},C:{}'.format(brightness, contrast), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) return cal if __name__ == '__main__': # The function imread loads an image # from the specified file and returns it. original = cv2.imread("pic.jpeg") # Making another copy of an image. img = original.copy() # The function namedWindow creates a # window that can be used as a placeholder # for images. cv2.namedWindow('GEEK') # The function imshow displays an # image in the specified window. cv2.imshow('GEEK', original) # createTrackbar(trackbarName, # windowName, value, count, onChange) # Brightness range -255 to 255 cv2.createTrackbar('Brightness', 'GEEK', 255, 2 * 255, BrightnessContrast) # Contrast range -127 to 127 cv2.createTrackbar('Contrast', 'GEEK', 127, 2 * 127, BrightnessContrast) BrightnessContrast(0) # The function waitKey waits for # a key event infinitely or for delay # milliseconds, when it is positive. cv2.waitKey(0)
Producción: