J'ai une taille d'image n (n, ligne, col) et une taille n de flottants (n, 1).
ce que je veux faire est de créer un masque de 0 et 1 de (ligne, col ) Taille. 1 est au centre et 0 dans les bords. la taille de 1 est fonction des poids.
exemple
>>> immask = np.zeros((2,8,8)) [[[0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.]] [[0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.]]] >>> multiplier = np.array([16./64,32./64]) [0.25 0.5 ] #**insert magic here** # expected result : [[[0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 1. 1. 0. 0. 0.] [0. 0. 0. 1. 1. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.]] [[0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.]]]
y a-t-il un moyen de faire cela avec la diffusion? ne pas utiliser de boucle. merci d'avance.
3 Réponses :
Je pense que si vous voulez utiliser une sorte de matrice à appliquer sur une image, ceci:
from scipy.ndimage.filters import convolve
pourrait fonctionner pour vous. Vous pouvez examiner de plus près ici comment cela fonctionne.
c'est noté. ce que je veux vraiment faire, c'est diviser une image en images 8x8, puis obtenir uniquement le centre de l'image en fonction de ses poids / pourcentages, donc cela ressemble à des images mais en pointillé et varie en fonction du rayon du point.
Essayez ceci:
In [1]: import numpy as np In [3]: immask = np.zeros((2,8,8)) In [6]: immask[0, 3:5, 3:5] = 1 In [7]: immask[1, 2:6, 2:6] = 1 In [8]: immask Out[8]: array([[[0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 1., 1., 0., 0., 0.], [0., 0., 0., 1., 1., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.]], [[0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 1., 1., 1., 0., 0.], [0., 0., 1., 1., 1., 1., 0., 0.], [0., 0., 1., 1., 1., 1., 0., 0.], [0., 0., 1., 1., 1., 1., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.]]])
sympa, je peux utiliser la boucle sur 'n' (c'est-à-dire 2), et en utilisant c'est négatif à la place immask [0, 3: -3, 3: -3] = 1. c'est facile à lire en boucle mais cela prendra du temps car J'ai beaucoup de «n».
Cette fonction fait quelque chose comme ça:
import numpy as np def make_circle_masks(weights, rows, cols=None): if cols is None: cols = rows # Add two dimensions to weights w = np.asarray(weights)[:, np.newaxis, np.newaxis] # Open grid of row and column coordinates r, c = np.ogrid[-1:1:rows * 1j, -1:1:cols * 1j] # Arrays with distances to centre d = r * r + c * c # Make masks where criteria is met return d <= w * w
Sortie:
[[[0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 1. 1. 0. 0. 0.] [0. 0. 0. 1. 1. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.]] [[0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 1. 1. 1. 1. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0.]]]
EDIT
Pour faire un cercle- masques en forme, la fonction pourrait être la suivante:
import numpy as np def make_masks(weights, rows, cols=None): if cols is None: cols = rows # Add two dimensions to weights w = np.asarray(weights)[:, np.newaxis, np.newaxis] # Open grid of row and column coordinates r, c = np.ogrid[-1:1:rows * 1j, -1:1:cols * 1j] # Make masks where criteria is met return (np.abs(r) <= w) & (np.abs(c) <= w) # Test masks = make_masks([0.25, 0.5], 8) # Convert type as needed masks_f = masks.astype(np.float32) print(masks_f)
merci, c'est ce que je recherche. les 1 peuvent-ils être façonnés en cercle?
@ itonia.x.i J'ai ajouté une version pour les masques en forme de cercle.
Qu'est-ce que tu as essayé jusque-là? Et comment vos poids devraient-ils affecter la quantité de 1? Le facteur multiplicateur est-il le rapport de 1 par ligne / colonne?
jusqu'à présent, un peu comme @ roland-smith answer, en utilisant la boucle sur range (n), en utilisant la moitié de la ligne et du col de l'image, soustraits par son rapport, en découpant comme si c'était de (+) gauche / haut: (-) droite / bas, les affecter par 1. immask [n, (col- (multiplier [n] * col) // 2) :-( col- (multiplier [n] * c ol) // 2), (row- (multip lier [n] * row) // 2) :-( r ow- (multiplier [n] * ro w) // 2)] (oubliant les détails, mais quelque chose comme ça)