Procesamiento de imágenes sin OpenCV | python

| | | | | | | | | |

Sabemos que OpenCV es muy utilizado para trabajar con imágenes y tiene una amplia gama de funciones para ello. Pero, ¿qué pasa si queremos procesar archivos de imagen sin usar ninguna biblioteca externa como OpenCV? Veamos cómo podemos hacer eso.

Escalado de imagen (usando la interpolación del vecino más cercano):

Interpolación del vecino más cercano — esta es la forma más fácil de interpolar. Este método simplemente determina el píxel vecino "más cercano" y toma un valor para su intensidad.

Considere una imagen pequeña cuyo ancho es w y la altura es — h que queremos cambiar de ancho p a ancho q, suponiendo que p > myq > norte. Ahora necesitamos dos constantes de escala:

scale_x = p / w scale_y = q / h 

Ahora simplemente iteramos sobre todos los píxeles en la imagen de salida, refiriéndose a los píxeles originales que están copiando de. escalando nuestras variables de control con scale_x y scale_y, y redondeando los valores de índice escalados resultantes.

Representación visual:
La imagen tiene 3X3 píxeles (9 píxeles en total), ahora, si queremos aumentar el tamaño de la imagen a 6X6, entonces, de acuerdo con el algoritmo vecino más cercano, 6/3 (es decir, 2) píxeles deben tener el mismo valor RGB que el píxel de valor a la imagen original.

Programa de escalado de imágenes:


< /tbody>

# usando matplotlib y numpy

importar matplotlib.image as img

importar numpy as npy


# proporcionar la ubicación de la imagen legible

m = img.imread ( "taj.png " );


# definir la longitud de la imagen original

w , h = m.shape [: 2 < clase de código = "simple">];


# xNew y yNew son el nuevo ancho y
# la altura de la imagen requerida
después de escalar

xNuevo = int (w * 1 / 2 );

yNuevo = int (h * 1 / < /código> 2 );


# calcular el factor de escala
# trabajar más de 2 píxeles

xScale = xNuevo / (w - 1 );

yScale = yNew / (h - 1 < /código> );


# usando numpy, tomando la matriz xNew
# ancho y nuevo alto con
# 4 atributos [alpha, B, G, B] valores ‚Äã‚Äã

nuevaImagen = npy.zeros ([xNew, yNew, 4 ]);


para i en < /código> rango (xNew - 1 ):

para j < /código> en rango (yNew - 1 ):

nuevaImagen [ i + 1 , j + 1 ] = m [ 1 + int (i / xScale),

1 + int (j / yScale)]


# Guardar imagen después de escalar

img.imsave ( `scaled.png ` , nuevaImagen);

Salida:

Escala de grises de la imagen:

Usando la media método de valor, este método enfatiza la intensidad de un píxel, en lugar de mostrar de qué valores RGB está compuesto. Cuando calculamos el valor RGB promedio y le asignamos el valor RGB para un 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 generan debido a una proporción diferente de RGB valores, ya que en este caso la relación sería 1:1:1. Por lo tanto, la imagen renderizada se verá como una imagen gris.

Representación visual:

Programa de imágenes en escala de grises:


# usando NumPy

importar numpy as npy


# usando matplotlib

importar matplotlib.image as img


# usar estadísticas para importar el promedio
# calcular el promedio

de estadísticas importar media


m = img.imread ( "taj.png" )


# define el ancho y el alto del imagen original

w, h = m .forma [: 2 ]


# nueva dimensión de imagen con 4 atributos por píxel

newImage = npy.zeros ([w, h, 4 ])

imprimir (w)

imprimir (h)


para i en rango (w):

< clase de código = "palabra clave"> para j en rango (h):

# La relación RGB estará entre 0 y 1

lst = [ float (m [i] [j] [ 0 ]), float (m [i] [j] [ 1 ]), float (m [i] [j] [ 2 ])]

avg = float (media (lst) )

nuevaImagen [i] [j] [ 0 ] = avg

nuevaImagen [i] [j] [ 1 ] = avg

nuevaImagen [i] [j] [< /código> 2 ] = avg

nuevaImagen [i] [j] [ 3 ] = 1 # el valor alfa debe ser 1


# Guardar imagen con imsave

img.imsave ( `grayedImage.png` , newImage)

Salida:

Recortar una imagen:

Recortar básicamente elimina píxel no deseado. Esto se puede hacer colocando el píxel requerido en otra cuadrícula de imágenes, cuyo tamaño coincida con el requerido después de recortar.

Considere una imagen con un tamaño de 10 √ó 10 píxeles, y si solo queremos recortar el centro de una imagen con un tamaño de 4 √ó 4 píxeles, luego necesitamos recopilar valores de píxeles ‚Äã‚Äãdesde (10-4) / 2, comenzando en (3, 3) hasta 4 píxeles en la dirección x y 4 píxeles en la dirección y.

Representación visual:

Recortador de imágenes:


# usando matplotlib y numpy

import matplotlib.image como img

import numpy as npy


# leer imagen en variable m

m = img.imread ( "taj.png" )


# definición del tamaño de la imagen ancho (w) alto (h)

w, h = m.shape [: 2 ]


# tamaño de imagen requerido después de recortar

xNew = int (w * 1 / 4 )

yNuevo = int (h * 1 / 4 )

nuevaImagen = npy.zeros ([xNuevo, yNuevo, 4 ])


# ancho de impresión altura de la imagen de origen

imprimir (w)

imprimir (h)


for i en rango ( 1 , xNew):

for j en rango ( 1 , yNuevo):

# recortar de 100 a 100 píxeles de la imagen original

nuevaImagen [i, j] = m [< /código> 100 + i, 100 + j]


# guarda la imagen

img.imsave ( `cropped.png` < clase de código = "simple">, nueva imagen)

Salida:

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers

News


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method