2017-01-24 17 views
2

C++でのMat::setToのpythonに相当するものは何ですか?OpenCV:C++の `setTo`に相当するPython

私は何をしようとしていることはマスクで値を設定することです:

Mat img; 
... 
img.setTo(0, mask); 

アップデート:ここで

が可能なソリューションです:Pythonで

#set by mask area to zero 
img= np.random.rand(200, 200, 3) * 255 
img= img.astype(np.uint8) 
mask = np.zeros((200, 200), np.uint8) 
mask[10:100, 60:140] = 255 
inv_mask= cv2.bitwise_not(mask) 
n_channels= img.shape[2] 
for i in range(0,n_channels): 
    img[..., i]= img[..., i] * (inv_mask/255) 

#to set arbitary value 
img= np.random.rand(200, 200, 3) * 255 
img= img.astype(np.uint8) 
mask= np.zeros((200,200), np.uint8) 
mask[10:100, 60:140]= 255 
mask_bool= np.where(mask > 0) 
value= 120 
img[mask_bool]= value 

答えて

3

あなたは、単にそれがマスクで平面全体を書き換えますimg.setTo(0, mask);

3

OpenCVのは、numpyのを使用していますイメージのバックエンド(具体的にはnumpy.ndarray)として。私は私がしなければならないすべてが1ように、第3のチャネルを設定したい場合は、

import numpy 
img = numpy.zeros((256, 256, 3)) # This initializes a color image as an array full of zeros 

:これは、あなたが次の操作を行うことができることを意味し

マスクは私の第三と同じ寸法を持っているのであれば
img[:, :, 2:3] = 1 

コメント後に編集
img[:, :, 2:3] = mask 

:チャンネル私は、第三のチャネルを設定するために使用することができた場合には、単にマスクシンプルimage * maskべきSUFを使用してゼロに画像のピクセルを設定したいですfice。マスクが画像と同じ次元数を持つことを確認してください。

編集#2:うまくいくかもしれませんが、マスクの形が唯一の問題であれば、mask[:, :, numpy.newaxis]を使用して寸法を加え、次に画像を乗算します。

btw numpy.newaxisは、mask[:,:,None]と同じです。

+0

のPythonの同等であるimg[mask > 0] = 0を使用することができますが、私はマスクによってゼロに画像の特定のピクセルを設定する必要があります。 – mrgloom

+0

編集された元の回答。 – antonmik

+0

imgは(256,256,3)で、マスクは通常(256,256)ですので、 'image * mask'は動作しません。有効な回答は私の更新を見てください。 – mrgloom