Cambiar el contraste y el brillo de una imagen usando Python – OpenCV

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:

Publicación traducida automáticamente

Artículo escrito por skrg141 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *