Matriz de reducción de resolución de Python

Muhammad Maisam Abbas 10 octubre 2023
  1. Matriz de reducción de muestra con corte en Python3
  2. Arreglo de reducción de muestra usando la función zoom() en Python
  3. Arreglo de reducción de muestra con la función block_reduce() en Python
Matriz de reducción de resolución de Python

Este tutorial discutirá los métodos para reducir la muestra de una imagen en Python.

Matriz de reducción de muestra con corte en Python3

En Python, una imagen es una matriz multidimensional. Las imágenes en escala de grises se representan con una matriz bidimensional, mientras que las imágenes en color o RGB se representan con una matriz tridimensional.

En aras de la simplicidad, este tutorial se centrará en reducir el tamaño de las imágenes bidimensionales en escala de grises, pero los métodos discutidos aquí también se pueden usar para reducir el tamaño de las imágenes RGB.

Nuestro primer método es muy sencillo. Al dividir, como sugiere el nombre, tomamos una porción pequeña de una imagen grande en general.

Mientras cortamos una imagen, podemos dar un parámetro de paso que especifica cuántos valores omitir antes de tomar el siguiente valor. De forma predeterminada, este valor se establece en 1.

El siguiente ejemplo de código demuestra cómo podemos usar el corte de matrices para reducir la muestra de una imagen.

import numpy as np

b = np.arange(0, 100)
c = b.reshape([10, 10])
print("Original Array:")
print(c)
print("Downsized Array:")
print(c[::2, ::2])

Producción :

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

El código escrito en la sección anterior reduce el tamaño de nuestra imagen original c de (10, 10) a (5, 5) y lo almacena en new_c.

Una cosa importante a tener en cuenta es que este método ha seleccionado 25 valores de nuestros 100 valores originales. La información en el resto de los valores se pierde completamente en este método.

Arreglo de reducción de muestra usando la función zoom() en Python

La función ndimage.interpolation.zoom() también se usa para aumentar o disminuir la muestra de una imagen en Python. Esta función toma 2 parámetros; la imagen original que necesita ser ampliada y la relación de zoom.

Este método es muy similar al método de corte. También omite los valores intermedios y solo selecciona unos pocos valores de nuestra imagen original mientras se reduce la muestra.

El siguiente ejemplo de código demuestra cómo podemos usar la función ndimage.interpolation.zoom() para reducir la muestra de una imagen.

import numpy as np
from scipy import ndimage

b = np.arange(0, 100)
c = b.reshape([10, 10])

new_c = ndimage.interpolation.zoom(c, 0.5)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

Producción :

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

El código escrito en la sección anterior funciona de la misma manera que el ejemplo anterior y reduce el tamaño de nuestra imagen original c de (10, 10) a (5, 5).

Este método es mejor que el simple corte porque también se puede usar para muestrear una imagen. Tenemos que especificar algunos valores de zoom mayores que 1.

Mientras se reduce la muestra, este método es ineficaz porque omite muchos valores de píxeles y selecciona solo unos pocos de nuestra imagen original. A continuación se describe un método más eficaz para estimar nuevos valores mediante la combinación de varios valores de píxeles.

Arreglo de reducción de muestra con la función block_reduce() en Python

Tanto el método de corte como el de zoom conducen al efecto de escalera, que desenfoca toda la imagen incluso cuando estamos reduciendo la muestra de la imagen de entrada.

Un mejor enfoque para manejar valores intermedios es estimarlos utilizando los píxeles que los rodean. Esto se puede hacer de diferentes maneras, como la interpolación y la media simple.

En aras de la simplicidad, utilizaremos el método de los medios simples. La función block_reduce() dentro del módulo skimage.measure de python se utiliza para reducir el tamaño de una matriz multidimensional.

Esta función block_reduce() toma 3 parámetros principales; la matriz original, el tamaño del bloque y la función que se aplicará en cada bloque.

El tamaño del bloque nos dice cuántos valores de nuestra imagen original se combinarán para formar un solo valor en nuestra imagen reducida y el parámetro func especifica la función que se aplicará para combinar todos los valores en un bloque.

Dado que, en todos nuestros ejemplos anteriores, hemos estado reduciendo una imagen (10, 10) a una imagen (5, 5), nuestro tamaño de bloque será (2, 2), y como queremos que el nuevo valor sea la media de todo el bloque en lugar de solo un valor del bloque, usaremos np.mean como func.

El siguiente ejemplo de código demuestra cómo podemos usar el método block_reduce() para reducir la muestra de nuestras imágenes.

import numpy as np
from skimage.measure import block_reduce

b = np.arange(0, 100)
c = b.reshape([10, 10])

new_c = block_reduce(c, block_size=(2, 2), func=np.mean)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

Producción :

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 5.5  7.5  9.5 11.5 13.5]
 [25.5 27.5 29.5 31.5 33.5]
 [45.5 47.5 49.5 51.5 53.5]
 [65.5 67.5 69.5 71.5 73.5]
 [85.5 87.5 89.5 91.5 93.5]]

El código escrito en la sección anterior toma un bloque (2, 2) de nuestra imagen original c, toma el promedio de los 4 valores dentro del bloque y coloca el resultado en nuestra nueva imagen new_c.

Este enfoque es mejor que los dos enfoques anteriores discutidos anteriormente porque toma el efecto combinado de todos los valores en lugar de solo tomar 1 valor del bloque de imagen original y omitir el resto de los 3 valores en cada bloque.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artículo relacionado - Python Array