1
votes

diffusion de création de masque numpy

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.


2 commentaires

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)


3 Réponses :


0
votes

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.


1 commentaires

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.



0
votes

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.]]])


1 commentaires

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».



0
votes

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)


2 commentaires

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.