¿Cómo dividir una matriz Numpy (imagen) en mosaicos para iterar? [duplicar]
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
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!
¡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()