¿Cómo dividir una matriz Numpy (imagen) en mosaicos para iterar? [duplicar]

Jan 04 2021

Tengo una imagen de tipo Numpy Array que me gustaría dividir en 9 (3 x 3) mosaicos pares sobre los que puedo iterar. ¿Cómo puedo hacer esto?

Aquí está mi código hasta ahora para generar el numpy.ndarray pero no he logrado dividirlo:

La matriz de imágenes numpy para dividir es th1

import cv2
import numpy as np

# Only for the threshold display
from matplotlib import pyplot as plt

# The Image to be used
image = 'six.png'

# Finding the average greyscale value
image_bgr = cv2.imread(image, cv2.IMREAD_COLOR)

# Calculate the mean of each channel
channels = cv2.mean(image_bgr)
# Type Float
thresh = channels[0]/2
#print (thresh)

# Displaying the threshold value
img = cv2.imread(image,0)
img = cv2.medianBlur(img,5)

# If below then black else white 
ret,th1 = cv2.threshold(img,thresh,255,cv2.THRESH_BINARY)


titles = ['Original Image', 'Global Thresholding']
images = [img, th1, ret]

for i in range(2):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

# Shows single image on its' own
plt.imshow(images[1], 'gray')
plt.xticks([]),plt.yticks([])

Aquí está la imagen (six.png):

Respuestas

2 GrgurDamiani Jan 04 2021 at 18:57

Lo que haría es crear una lista o una matriz bidimensional en la que guardaría los "mosaicos" de la imagen completa. Los mosaicos se copiarían usando el siguiente código:

height, width, dim = img.shape
image_tile = img[0:height/3, 0:width/3]

Crea un nuevo ndarray image_tile que contiene la parte de la matriz de imagen completa que está dentro de las coordenadas. En este caso, es el mosaico superior izquierdo.

Todo el ejemplo con un bucle for se vería así:

image_tile = []
for i in range(0,3):
    for j in range(0,3):
        image_tile.append(img[i * height/3:(i+1) * height/3, j * width/3:(j+1) * width/3])

Espero que esto ayude. Mucha suerte!

1 Aiyush Jan 04 2021 at 19:31

¡He encontrado una solución adaptada de otro lugar y funciona muy bien!

img = th1
numrows, numcols = 3, 3
height = int(img.shape[0] / numrows)
width = int(img.shape[1] / numcols)
for row in range(numrows):
    for col in range(numcols):
        y0 = row * height
        y1 = y0 + height
        x0 = col * width
        x1 = x0 + width
        individual =  (img[y0:y1, x0:x1])
        plt.imshow(individual, 'gray')
        plt.xticks([]),plt.yticks([])
        plt.show()