Transformación negativa de una imagen usando Python y OpenCV

La imagen también se conoce como un conjunto de píxeles. Cuando almacenamos una imagen en computadoras o digitalmente, se almacenan sus valores de píxel correspondientes. Entonces, cuando leemos una imagen a una variable usando OpenCV en Python, la variable almacena los valores de píxel de la imagen. Cuando tratamos de transformar negativamente una imagen, las áreas más brillantes se transforman en las más oscuras y las áreas más oscuras se transforman en las más brillantes.

Como sabemos, una imagen en color almacena 3 canales diferentes. Son rojo, verde y azul. Es por eso que las imágenes en color también se conocen como imágenes RGB. Entonces, si necesitamos una transformación negativa de una imagen, entonces debemos invertir estos 3 canales.

Veamos 3 canales de una imagen en color trazándola en el histograma.

Imagen de entrada –

Negative-transformation-python-opencv

# We need cv2 module for image 
# reading and matplotlib module
# for plotting
import cv2
import matplotlib.pyplot as plt
   
img_bgr = cv2.imread('scenary.jpg', 1)
   
color = ('b', 'g', 'r')
  
for i, col in enumerate(color):
    histr = cv2.calcHist([img_bgr], [i], None, [256], [0, 256])
    plt.plot(histr, color = col)
    plt.xlim([0, 256])
      
plt.show()

Producción:

Negative-transformation-python-opencv

Aquí, los 3 canales (Rojo, Verde, Azul) se superponen y crean un solo histograma. Si ha estudiado antes sobre píxeles y RGB, puede saber que cada color contiene 256 valores. Si el valor RGB de un color es (255, 255, 255), ese color se muestra como blanco y si el valor RGB de un color es (0, 0, 0), ese color se muestra como negro. Así, los 3 canales anteriores también contienen 256 números de píxeles.

Entonces, el eje X muestra un total de 256 valores (0 – 255) y el eje Y muestra las frecuencias totales de cada canal. Como puede ver en el histograma, el canal azul tiene la frecuencia más alta y puede marcar fácilmente la cantidad de color azul presente en la imagen al mirarlo.

Transformación negativa de la imagen.

Vamos a crear una transformación negativa de la imagen. Hay 2 formas diferentes de transformar una imagen en negativo usando el módulo OpenCV. El primer método explica la transformación negativa paso a paso y el segundo método explica la transformación negativa de una imagen en una sola línea.

Primer método: Pasos para la transformación negativa

  1. leer una imagen
  2. Obtener alto y ancho de la imagen.
  3. Cada píxel contiene 3 canales. Entonces, tome un valor de píxel y recopile 3 canales en 3 variables diferentes.
  4. Niegue los valores de 3 píxeles de 255 y guárdelos nuevamente en el píxel usado anteriormente.
  5. Hágalo para todos los valores de píxeles presentes en la imagen.

Código de Python para el primer método: –

import cv2
import matplotlib.pyplot as plt
  
  
# Read an image
img_bgr = cv2.imread('scenary.jpg', 1)
plt.imshow(img_bgr)
plt.show()
  
# Histogram plotting of the image
color = ('b', 'g', 'r')
  
for i, col in enumerate(color):
      
    histr = cv2.calcHist([img_bgr], 
                         [i], None,
                         [256], 
                         [0, 256])
      
    plt.plot(histr, color = col)
      
    # Limit X - axis to 256
    plt.xlim([0, 256])
      
plt.show()
  
# get height and width of the image
height, width, _ = img_bgr.shape
  
for i in range(0, height - 1):
    for j in range(0, width - 1):
          
        # Get the pixel value
        pixel = img_bgr[i, j]
          
        # Negate each channel by 
        # subtracting it from 255
          
        # 1st index contains red pixel
        pixel[0] = 255 - pixel[0]
          
        # 2nd index contains green pixel
        pixel[1] = 255 - pixel[1]
          
        # 3rd index contains blue pixel
        pixel[2] = 255 - pixel[2]
          
        # Store new values in the pixel
        img_bgr[i, j] = pixel
  
# Display the negative transformed image
plt.imshow(img_bgr)
plt.show()
  
# Histogram plotting of the
# negative transformed image
color = ('b', 'g', 'r')
  
for i, col in enumerate(color):
      
    histr = cv2.calcHist([img_bgr], 
                         [i], None,
                         [256],
                         [0, 256])
      
    plt.plot(histr, color = col)
    plt.xlim([0, 256])
      
plt.show()

Producción :

Negative-transformation-python-opencv
(Original image and it’s histogram)

Negative-transformation-python-opencv
(Negative image and it’s histogram)

2do método: Pasos para la transformación negativa

  1. Lee una imagen y guárdala en una variable.
  2. Resta la variable de 1 y almacena el valor en otra variable.
  3. Todo listo. Has realizado con éxito la transformación negativa.

Código de Python para el segundo método: –

import cv2
import matplotlib.pyplot as plt
  
  
# Read an image
img_bgr = cv2.imread('scenary.jpg', 1)
  
plt.imshow(img_bgr)
plt.show()
  
# Histogram plotting of original image
color = ('b', 'g', 'r')
  
for i, col in enumerate(color):
      
    histr = cv2.calcHist([img_bgr],
                         [i], None,
                         [256],
                         [0, 256])
      
    plt.plot(histr, color = col)
      
    # Limit X - axis to 256
    plt.xlim([0, 256])
      
plt.show()
  
# Negate the original image
img_neg = 1 - img_bgr
  
plt.imshow(img_neg)
plt.show()
  
# Histogram plotting of
# negative transformed image
color = ('b', 'g', 'r')
  
for i, col in enumerate(color):
      
    histr = cv2.calcHist([img_neg],
                         [i], None, 
                         [256],
                         [0, 256])
      
    plt.plot(histr, color = col)
    plt.xlim([0, 256])
      
plt.show()

Producción :

Negative-transformation-python-opencv
(Original image and it’s histogram)

Negative-transformation-python-opencv
(Negative image and it’s histogram)

Publicación traducida automáticamente

Artículo escrito por pankajpatra1998 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 *