2017-08-30 8 views
1

マスクされたイメージがあり、そのイメージのマスクされたピクセルを別の配列の値で置き換えようとしています。私は、forループのネストされたを使用しています:配列内のセルを置換するためにネストされたforループ

import scipy.ndimage as ndi 
import matplotlib.pyplot as plt 
import numpy as np 

# Generate random image and mask 
np.random.seed(seed=5)      # To use the same random numbers 
h, w = 10, 10 
mask = np.random.randint(2, size=(h, w)) # Generate a h x w array of 
              # random integers from 0 - 1 
img = np.random.rand(h, w)     # Generate a h x w array of 
              # random floats 
img_masked = np.where(mask, img, np.nan) # Mask the img array and replace 
              # invalid values with nan's 

# Use generic filter to compute nan-excluding median of masked image 
size = 3 
img_masked_median = ndi.generic_filter(img_masked, np.nanmedian, size=size) 

new_img = np.ones_like(img_masked) 
# Use a for loop to look at each pixel in the masked, unfiltered image 
height, width = img_masked.shape 
for y in range(height): 
    for x in range(width): 
     if img_masked[x, y] != []: 
      new_img[x, y] = img[x, y] 
     else: 
      new_img[x, y] = img_masked_median[x, y] 

# Plot results in 4x4 grid 
fig, ax = plt.subplots(nrows=2, ncols=2) 
ax[0,0].imshow(img) 
ax[0,0].set_title('img') 
ax[0,1].imshow(img_masked_median) 
ax[0,1].set_title('img_masked_median') 
ax[1,0].imshow(img_masked) 
ax[1,0].set_title('img_masked') 
ax[1,1].imshow(new_img) 
ax[1,1].set_title('new_img') 
plt.show() 

フィルタが正常に動作し、今私はちょうどimg_masked_medianからの対応するピクセルとIMGの任意のマスクされたピクセルを交換したいです。 現時点では、ループは単にimg_masked_medianのコピーを生成します。私は

if img_masked[x, y] != np.nan: 

するライン24の状態を変更する場合は、今では、IMGのコピーを生成します。
forループがピクセルを正しく置き換えないのはなぜですか?

答えて

0

最初のバージョンの問題点は、は決して[]にならないということです。これは空リストです - img_maskedの要素はリストではなくnumpy浮動小数点数です。

あなたはif img_masked[x, y] != np.nanにチェックを変更した場合、あなたはnp.nan自体に等しくないという問題に遭遇:

>>> np.nan == np.nan 
False 

両方の技術の問題点は、常に使用して最初のifは、常にTrueであるということです古いimgを入力してnew_imgを入力します。このようなバグを探すときは、各ブランチにprintを置くことを強くお勧めします。ブランチが正しく動作していないことを明確にします。

一貫性のある結果を得るために、np.isnanを使用します。

# Use a for loop to look at each pixel in the masked, unfiltered image 
height, width = img_masked.shape 
for y in range(height): 
    for x in range(width): 
     if np.isnan(img_masked[x, y]): 
      new_img[x, y] = img[x, y] 
     else: 
      new_img[x, y] = img_masked_median[x, y] 
関連する問題