Sabemos que OpenCV se usa ampliamente para operar con imágenes y tiene un amplio espectro de funciones para hacerlo. Pero, ¿qué sucede si queremos procesar los archivos de imagen sin usar ninguna biblioteca externa como OpenCV? Veamos cómo podemos hacer esto.
Escalado de la imagen (usando la interpolación del vecino más cercano):
La interpolación del vecino más cercano es la forma más sencilla de interpolación. Este método simplemente determina el píxel vecino «más cercano» y asume su valor de intensidad.
Considere una imagen pequeña que tiene ‘w’ píxeles de ancho por ‘h’ píxeles de alto, que queremos redimensionar a ‘p’ píxeles de ancho por ‘q’ píxeles de alto, asumiendo que p>m y q>n. Ahora, necesitamos dos constantes de escala:
scale_x = p/w scale_y = q/h
Ahora, simplemente recorremos todos los píxeles en la imagen de salida, dirigiéndonos a los píxeles de origen para copiar escalando nuestras variables de control por scale_x y scale_y , y redondeando los valores de índice escalados resultantes.
Representación pictórica:
Imagen de 3X3 píxeles (9 píxeles en total), ahora si queremos aumentar el tamaño de la imagen hasta 6X6, según el algoritmo vecino más cercano, 6/3 (es decir, 2) píxeles deben tener el mismo valor RGB que el de el píxel en la imagen original.
Programa para escalar una Imagen:
Python3
# using matplotlib and numpy import matplotlib.image as img import numpy as npy # provide the location of image for reading m = img.imread("taj.png"); # determining the length of original image w, h = m.shape[:2]; # xNew and yNew are new width and # height of image required after scaling xNew = int(w * 1 / 2); yNew = int(h * 1 / 2); # calculating the scaling factor # work for more than 2 pixel xScale = xNew/(w-1); yScale = yNew/(h-1); # using numpy taking a matrix of xNew # width and yNew height with # 4 attribute [alpha, B, G, B] values newImage = npy.zeros([xNew, yNew, 4]); for i in range(xNew-1): for j in range(yNew-1): newImage[i + 1, j + 1]= m[1 + int(i / xScale), 1 + int(j / yScale)] # Save the image after scaling img.imsave('scaled.png', newImage);
Producción:
Escala de grises de una imagen:
Usando el método de valor promedio, este método resalta la intensidad del píxel en lugar de mostrar en qué valores RGB consiste. Cuando calculamos el valor promedio de RGB y lo asignamos al valor RGB del píxel, dado que el valor RGB del píxel es el mismo, no podrá crear ningún color ya que todos los colores se forman debido a una proporción diferente del valor RGB ya que en esta relación de casos será 1:1:1. Por lo tanto, la imagen formada entonces se verá como una imagen gris.
Representación pictórica:
Programa para la escala de grises de una imagen:
Python3
# using numpy import numpy as npy # using matplotlib import matplotlib.image as img # using statistics to import mean # for mean calculation from statistics import mean m = img.imread("taj.png") # determining width and height of original image w, h = m.shape[:2] # new Image dimension with 4 attribute in each pixel newImage = npy.zeros([w, h, 4]) print( w ) print( h ) for i in range(w): for j in range(h): # ratio of RGB will be between 0 and 1 lst = [float(m[i][j][0]), float(m[i][j][1]), float(m[i][j][2])] avg = float(mean(lst)) newImage[i][j][0] = avg newImage[i][j][1] = avg newImage[i][j][2] = avg newImage[i][j][3] = 1 # alpha value to be 1 # Save image using imsave img.imsave('grayedImage.png', newImage)
Producción:
Recorte de una imagen:
Recortar es básicamente eliminar el píxel no deseado. Esto se puede hacer tomando el píxel requerido en una cuadrícula de imagen diferente cuyo tamaño sea el requerido después del recorte.
Considere una imagen de tamaño 10 X 10 píxeles y si necesitamos recortar solo el centro de la imagen con 4 X 4 píxeles, entonces debemos recopilar los valores de píxeles desde (10-4)/2 a partir de (3, 3) hasta 4 píxeles en la dirección x y 4 píxeles en la dirección y .
Representación pictórica:
Programa para recortar una imagen:
Python3
# using matplotlib and numpy import matplotlib.image as img import numpy as npy # reading image in variable m m = img.imread("taj.png") # determining dimension of image width(w) height(h) w, h = m.shape[:2] # required image size after cropping xNew = int(w * 1 / 4) yNew = int(h * 1 / 4) newImage = npy.zeros([xNew, yNew, 4]) # print width height of original image print(w) print(h) for i in range(1, xNew): for j in range(1, yNew): # cropping start from 100, 100 pixel of original image newImage[i, j]= m[100 + i, 100 + j] # save image img.imsave('cropped.png', newImage)
Producción: