2017-09-12 63 views
0

私はopencvを使って1チャンネル画像のピクセル値を変更しています。 私はコード実行しOpenCvのfillPoly()はグレースケール(1チャンネル)の画像では機能しません

curr = np.zeros((660,512, 1)) 

を使用して空白のイメージを作成します。

for r in regions: 
    cv2.fillPoly(curr, r, [190]) 

それぞれの領域のようなものになります。ここで

[[[363 588] 
    [304 593] 
    [323 652] 
    [377 654]]] 

を私はコードは、少なくとも多少動作していることを知っているがこれは、imshow()を使用すると、領域が必要に応じて埋められるためです。しかし、私は再アクセスする修正ピクセル値を試みたが、得た[0]私は次のように全体のimg TIに一時ファイルを書き込みしようとした:

for elt in curr: 
    f2.write(str(elt) + '\n') 

ただし、ファイルがちょうど

[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
[ 0.] 
のように見えます

どこが間違っていますか?なぜ私は画像に書いた190に再びアクセスできないのですか?

答えて

1

うまく動作します。

curr = np.zeros((660,512, 1),dtype = np.uint8) 

regions = np.array([[[363,588],[304,593],[323,652],[377,654]]]) 

for r in regions: 
    cv2.fillPoly(curr, [regions[0]], (190)) 

# find minimum value, maximum value and their location index in the image 
minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(curr) 

print(maxVal, maxLoc) 
1

は、多分あなたは、過書き込みまたは再初期化画像(CURR)どこかのコードでは、ここにファイルを保存するcv2.imwriteを使用してコードです。

curr = np.zeros((660,512, 1)) 
regions = np.random.uniform(1, 200, size=(1, 5, 2)) 
regions = regions.astype(np.int32, copy=False) 
for r in regions: 
    cv2.fillPoly(curr, [r], [190]) 

while(1): 
    cv2.imshow('Terry Martin', curr) 
    k= cv2.waitKey(1) & 0xFF 
    if k == 27: 
     cv2.imwrite('FillPloy.jpg', curr) 
     break 

cv2.destroyAllWindows() 

OpenCVのウィンドウ: enter image description here

出力画像:Iウィンドウに画像を表示する、前記したよう

enter image description here
+0

。それはちょうどいいようです。しかし、私はその後、ファイルを見て、最大値を見つけることができるようにしたい。 代わりに、画像をpngとしてファイルに書き込んだり、imreadを使って保存したファイルを開いたりしようとしました。今、[190、190、190]を画像の最大値として取得しました。これはグレースケールの画像から期待されるものですか?画像の形状が(660,512,1)なので、個々のピクセルにアクセスすると私に特異な価値が与えられると思った。しかし、img [x] [y]にアクセスすると常に3要素配列が返されます。 –

関連する問題