2017-03-12 4 views
0

ピクセル値がしきい値を超えているかどうかを確認するための基本的なしきい値処理プログラムを作成しようとしています。 (私の場合は128をしきい値に設定します)128より大きい場合は、そのピクセル値を128に設定したい場合は0に設定します。このロジックをダウンさせる際に問題が発生しています。エラーメッセージが表示されるIndexError:スカラー変数に対するインデックスが無効です。どこが間違っていますか?入力画像のしきい値処理

import pylab as plt 
import matplotlib.image as mpimg 
import numpy as np 

    img = np.uint8(mpimg.imread('abby.jpg')) 


img = np.uint8((0.2126* img[:,:,0]) + \ 
     np.uint8(0.7152 * img[:,:,1]) +\ 
     np.uint8(0.0722 * img[:,:,2])) 



threshold = 128 

for row in img: 
    for col in row: 
    if col[0] > threshold: 
     col[0] = threshold 
    else: 
      col[0] = 0 


plt.xlim(0, 255) 
plt.hist(img,10) 
plt.show() 
+0

トレースバックを表示できますか?つまり、あなたのソースのどのコード行でエラーが発生しているのでしょうか。ネストされたループのインデントもオフです。 –

+0

こんにちは、インパクトのあるインデントの理由は、私がそうしたときに、コーディングとその同期が外れていることをコピーして貼り付けることによるものです。ここでトレースバックのトレースバック(最新の最後の呼び出し): ファイル "/Users/Micheal/PycharmProjects/untitled1/input.py" の場合col [0]>しきい値: IndexError:スカラーへの無効なインデックス変数。 –

答えて

0

問題は、あなたがインデックスにnumpy配列でないnumpy.uint8(8ビット符号なし整数)を、しようとしているということです。あなたのコードにいくつかのprintステートメントを投げれば、簡単にバグを見つけることができます。ここに私がしたことがあります。

In [24]: for row in img: 
    ...:  # print(row) 
    ...:  for col in row: 
    ...:   print(type(col)) 
    ...:   break 
    ...:  break 
    ...: 
<class 'numpy.uint8'> 

だけcolcol[0]を変更します。また、私は通常、画像として2d numpy配列をプロットするのにplt.imshow(x)を使用します。

import pylab as plt 
import matplotlib.image as mpimg 
import numpy as np 

img = np.uint8(mpimg.imread("test.png")) 

img = np.uint8((0.2126* img[:,:,0]) + \ 
    np.uint8(0.7152 * img[:,:,1]) +\ 
    np.uint8(0.0722 * img[:,:,2])) 

threshold = 128 

for row in img: 
    for col in row: 
     if col > threshold: 
      col = threshold 
     else: 
      col = 0 

plt.imshow(img) 
plt.show()