2016-06-24 4 views
0

Ich habe eine Matrix mit int drin.Medianfilter auf Pixel mit einem bestimmten Wert anwenden?

Ich muss die 111 durch den Median seiner unmittelbaren 4 Nachbarschaft ersetzen, wenn einer der Nachbarn 111 sind, dann werden sie ignoriert.

Für zB: -

matrix = 1 2 3 4 5 6 
     101 111 1 3 44 3 
     111 3 4 4 5 6 
      1 2 4 5 7 7 

after replacing expected op 
1 2 3 4 5 6 
101 2.5 1 3 44 3 
3 3 4 4 5 6 
1 2 4 5 7 7 

Mein Code ist ziemlich schlecht und wahrscheinlich sehr langsam. jede Hilfe

def median_fil_mat(matrix): 
    rows,columns= np.where(matrix==111) 
    r,c=np.shape(matrix) 
    for each_row in rows: 
     for each_colmn in columns: 
      if each_row==r-1: 
       r1=[each_row-1] 
      elif each_row>0 & each_row!=r-1: 
       r1= [each_row-1,each_row+1] 
      else: 
       r1=[each_row+1] 

      if each_colmn ==c-1: 
       c1=[each_colmn-1] 
      elif each_colmn >0 & each_colmn!=c-1: 
       c1=[each_colmn-1,each_colmn+1] 
      else: 
       c1=[each_colmn+1] 
      med_lis=list() 
      for rr in r1: 
       for cc in c1: 
        med_lis.append(matrix[rr,cc]) 
      med_lis=[x for x in med_lis if x!=111 ] 
      matrix[each_row,each_colmn]= np.median(med_lis) 
    return matrix 
+0

aktualisieren Sie absichtlich iterativ jedes Element, wie Sie verarbeiten? Angenommen, Sie aktualisieren ein Element an der Position "(x1, y1)", weil es in seiner Umgebung eine 111 hat. Dann verarbeitest du das nächste Element '(x1, y + 1)', das zufällig auch eine '111' in seiner Nachbarschaft hat. Jetzt befindet sich das vorherige Element in der Nähe dieses aktuellen Elements. Würden Sie also den "(x1, y1)" aktualisierten Wert des vorherigen Elements oder den ursprünglichen Wert verwenden, um das aktuelle Element "(x1, y1 + 1)" zu aktualisieren? – Divakar

+0

yeah Idealerweise sollte ich das nicht tun und alle benachbarten 111 durch den Median ersetzen, der im gleichen Stil wie oben beschrieben berechnet wurde. Aber ich weiß nicht, wie ich das machen könnte, also so. –

+0

Vielleicht ein Ausgangsarray mit einer Kopie des Eingangsarrays initialisieren und das Ausgangsarray bei jeder Iteration aktualisieren? Würde das Ihnen die erwarteten Ergebnisse geben? – Divakar

Antwort

0
def func(array): 
    if array[2]==111: 
     return np.median(array[array!=111]) 
    else: 
     return array[2] 
fp = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]]) 
a = np.fromstring("""1 2 3 4 5 6 
     101 111 1 3 44 3 
     111 3 4 4 5 6 
      1 2 4 5 7 7""", sep=" ").reshape((4, 6)) 
generic_filter(a, func, footprint=fp, mode='nearest') 

Returns

array([[ 1. , 2. , 3. , 4. , 5. , 6. ], 
     [ 101. , 2.5, 1. , 3. , 44. , 3. ], 
     [ 3. , 3. , 4. , 4. , 5. , 6. ], 
     [ 1. , 2. , 4. , 5. , 7. , 7. ]]) 
geschätzt
+0

(Fast, bemerkte kleines Problem ...) – Phlya

+0

nun richtig wiht sein sollte moed 'nearest' – Phlya

Verwandte Themen