2016-06-24 2 views
0

I内部にintを持つ行列があります。特定の値のピクセルにメジアンフィルタを適用しますか?

隣人のいずれかが111である場合は、111をその直近の4近傍の中央値に置き換える必要がありますが、無視されます。例えばのために

: -

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 

私のコードはかなり悪いと、おそらく非常に遅いです。すべてのヘルプは

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

あなたが処理しているとして、あなたが意図的に繰り返し、各要素を更新しているに感謝しますか? '(x1、y1)'の位置にある要素を更新するとしましょう。次に、次の要素 '(x1、y + 1)'を処理します。この要素はその近隣に1つの '111'を持っています。前の要素は、この現在の要素の近傍に存在します。したがって、前の要素の '(x1、y1)'更新された値または元の値を使って、現在の要素 '(x1、y1 + 1) 'を更新しますか? – Divakar

+0

ええ理想的には、私はそれをやってはならず、上記の同じスタイルで計算された中央値を隣接するすべての111に置き換えてください。しかし、私はどのようにしてこのようにすることができるのかわかりません。 –

+0

出力アレイを入力配列のコピーで初期化し、各繰り返しで出力配列を更新することはできますか?それはあなたに期待される結果を与えるでしょうか? – Divakar

答えて

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') 

戻り

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

(ほとんど、小さな問題に気付きました...) – Phlya

+0

正しいことがありますmoed 'nearest' – Phlya

関連する問題