2017-01-24 11 views
2

Was ist das Python-Äquivalent von Mat::setTo in C++?OpenCV: Python-Äquivalent von `setTo` in C++

Was ich versuche zu tun Wert von Maske zu setzen:

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

Update:

Hier mögliche Lösung ist:

#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 

Antwort

3

Sie können einfach img[mask > 0] = 0 verwenden, das ist der Python-äquivalent img.setTo(0, mask);

3

opencv in Python verwendet numpy als Backend (genauer numpy.darray) für Bilder. Das heißt, Sie können die folgenden:

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

Dann, wenn ich den dritten Kanal einstellen wollen als 1 alles, was ich tun müssen, ist:

img[:, :, 2:3] = 1 

Deshalb, wenn Maske die gleichen Abmessungen wie mein drittes hat Kanal i kann es verwenden, um den dritten Kanal einzustellen:

img[:, :, 2:3] = mask 

nach Kommentar bearbeitet: falls Sie mögen einfach Pixel des Bildes auf Null setzen, eine Maske mit einem einfachen image * mask sollte suf Büro. Stellen Sie sicher, dass die Maske die gleiche Anzahl von Dimensionen wie das Bild hat.

bearbeiten # 2: Ja, das könnte funktionieren, aber wenn die Form Ihrer Maske das einzige Problem ist, würde ich mask[:, :, numpy.newaxis] verwenden, um eine Dimension hinzuzufügen und dann mit Bild zu multiplizieren.

btw numpy.newaxis ist das gleiche wie mit mask[:,:,None].

+0

Es ganze Ebene mit Maske neu zu schreiben, aber ich brauche spezifisches Pixel des Bildes auf Null Maske einzustellen. – mrgloom

+0

Bearbeitete ursprüngliche Antwort. – antonmik

+0

Img ist (256, 256, 3) und Maske ist in der Regel (256, 256) so 'Image * Maske' wird nicht funktionieren. Siehe mein Update für eine gültige Antwort. – mrgloom