2017-10-24 11 views
0

Ich versuche, eine Farbmaske auf ein Farbbild anzuwenden. Die Farbmaske ist eine Kontur, die ich auf das Farbbild anwenden möchte. Die Maske ist komplett schwarz bis auf den Umriss, der rosa ist (BGR = [180, 105,255]). Seltsamerweise kann ich einen Umriss, der cyan ist [227,230,49] mit der folgenden Methode anwenden:OpenCV - Farbmaske auf Farbbild anwenden

Lassen Sie das Farbbild imgColor und die Cyan Outline sein maskCyan. Auch diese Maske ist schwarz [0,0,0] mit Ausnahme der Pixel, die Teil der Gliederung sind, die [227,230,49] sind. Dann kann ich dies über das Bild anwenden, indem ich einfach imgColor_with_cyan_outline = cv2.bitwise_or(imgColor, maskCyan) mache. Wenn ich das selbe mit maskPink mache, das rosa Pixel anstelle von cyan hat, imgColor_with_pink_outline = cv2.bitwise_or(imgColor, maskPink) verwendend, dann werde ich das ursprüngliche Bild ohne irgendeine Maske oder Kontur zurückbringen, die auf es angewendet werden. Ich glaube, ich verstehe nur nicht, wie funktioniert cv2.bitwise_or(), aber ich bin mir nicht sicher.

Gibt es eine andere Möglichkeit, eine Farbmaske auf ein Farbbild anzuwenden?

+1

Mögliche Duplikat [Kopieren Werte von einer numpy Matrix zu einem anderen abhängig von boolean Maske] lesen (https://stackoverflow.com/questions/22255368/copying-values-from-one-numpy-matrix-in-another-dependent-on-boole-an-) –

+1

bitweise oder -> nimmt jedes Bit und tun ODER mit der dasselbe Bit im anderen Bild. Wenn Sie zum Beispiel Pixel 63 in einem Bild und 255 in einem anderen Bild haben, ergibt das 255. Wenn Sie 63 und 72 haben, ergibt das 127 (63 ist 00111111 und 72 bin 01001000 im Binärformat). Sie können und mit der Umkehrung der Maske als binäre (weiß und schwarz), um das Pixel zu "entfernen", oder drehen Sie sie schwarz aus dem Bild. Dann fügen Sie es mit dem Cyan ein und Sie erhalten den Cyan im Bild, oder verwenden Sie numpy als @ DanMašek Link ersetzen – api55

Antwort

2

Ich glaube, Sie haben die Eigenschaften der bitweisen OR Operation missverstanden. Die cv2.bitwise_or nimmt zwei Quellbilder plus eine optionale Maske.

cv2.bitwise_or(src1, src2, dst, mask) 

Wenn also src1 ein Pixel mit dem Wert 1 hat und src2 ein Pixel mit dem Wert 2 hat, dann ist src1 | src2:

0001 = src1 
0010 = src2 
0011 = src1 | src2 

die den resultierenden Pixelwert 3. Für die 8-bit unsigned char macht Bilder, der maximale resultierende Pixelwert ist 255 (135 | 235 ist 255).

+0

Das macht mehr Sinn. Ich dachte, es bedeute, dass es den zweiten Wert nehmen würde, wenn es nicht 0 wäre. Also, wenn du 'cv2.bitwise_or ([255,255,255], [0,0,0]) = [255,255,255]' und 'cv2.bitwise_or ([255,255,255], [126,122,0]) = [126,122,0] '. Das ist, was ich wirklich brauche, ist eine Funktion, die alle Pixel im ersten Bild durch Nicht-Null-Pixel vom zweiten Argument ersetzt. – greenthumbtack

+0

@grenthumbtack Was Sie wollen, ist ein Bild auf ein anderes basierend auf Maske zu kopieren. Dafür sehen Sie diesen ausgezeichneten Beitrag: https://stackoverflow.com/questions/41572887/equivalent-of-copyto-in-python-opencv-bindings – zindarod

0

Sie können die Funktion cv2.inrange zum Maskieren verwenden, wenn Sie ein Gerät zum Filtern haben. Ändern Sie den folgenden Code als Ihre Werte. Prüfen Sie, ob Syntax entsprechend Ihrer opencv Version

Pink=cv2.inrange(pink baundary) 
Black=cv2.inrange(black baundary) 
Mask= Pink+Black 

Weitere Informationen Sie

https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

+0

Wie würde ich das verwenden? Die Maske hat nur 2 Farben, schwarz und pink. Ich dachte "inrange" ist für die Suche nach einer Farbe in einem Bild, keine Maske anwenden. – greenthumbtack

+0

Ich bearbeite meinen Kommentar Bitte sehen Sie meine Antwort noch einmal. –

Verwandte Themen