2016-07-13 9 views
1

Ich versuche, ein BGR-Bild zu schwellen, nachdem ich den roten Kanal getrennt habe, aber mein Code immer "Segmentierung Fehler" zurück.Python opencv Schwelle rotes Bild

import numpy as np 
import cv2 
def mostrarVentana (titulo, imagen): 
    print('Mostrando imagen') 
    cv2.imshow(titulo, imagen) 
    k = cv2.waitKey(0) 
    if k == 27:   # wait for ESC key to exit 
    cv2.destroyAllWindows() 

img = cv2.imread('RepoImagenes/640x480/P5.jpg', 1) # loading image in BGR 
redImg = img[:, :, 2] # extracting red channel 
rbin, threshImg = cv2.threshold(redImg, 58, 255, cv2.THRESH_BINARY) # thresholding 
mostrarVentana('Binary image', threshImg) 

Ich habe die Dokumentation zu lesen, wie die Schwelle() Funktion zu verwenden, und ich kann nicht herausfinden, was los ist. Ich muss nur am roten Kanal arbeiten, wie kann ich das schaffen?

Ich verwende Python 3.4 und opencv 3.1.0

+0

Vermutlich ist Datei nicht gefunden ... Verwenden Sie einen Debugger, um zu sehen, welche Zeile fehlschlägt, und untersuchen Sie Variablen. – Photon

+0

@Phot Die Bilddatei wird korrekt geladen, wenn ich die Zeile mit der Schwellenwertfunktion kommentiere, funktioniert der Code korrekt, da ich die threshImg-Variable nicht anrufe. – JorgeLopez

Antwort

1

allererst opencv eine einfache API bietet n-channel Bild aufzuspalten, cv2.split() verwendet, die eine Liste der verschiedenen Kanäle im Bild zurückkehren würde.

Es gibt auch einen Fehler in Ihrer mostrarVentana Methode haben Sie erstellt nie ein cv2.namedWindow() und Sie verweisen direkt auf cv2.imshow(), aber man kann nicht einfach cv2.imshow(), ohne ein cv2.namedWindow() zu schaffen.

Auch müssen Sie sicher sein, dass das Bild richtig geladen ist und dann auf den gewünschten Kanal zugreifen, sonst würde es zu seltsamen Fehlern führen. Ihr Code mit einigen Szenario-Handhabung würde wie folgt aussehen:

import numpy as np 
import cv2 
def mostrarVentana (titulo, imagen): 
    print('Mostrando imagen') 
    cv2.namedWindow(titulo, cv2.WINDOW_NORMAL) 
    cv2.imshow(titulo,imagen) 
    k = cv2.waitKey(0) 
    if k == 27:   # wait for ESC key to exit 
     cv2.destroyAllWindows() 

img = cv2.imread('RepoImagenes/640x480/P5.jpg', 1) # loading image in BGR 
print img.shape #This should not print error response 

if not img is None and len(img.shape) == 3 and img.shape[2] == 3: 
    blue_img, green_img, red_img = cv2.split(img) # extracting red channel 
    rbin, threshImg = cv2.threshold(red_img, 58, 255, cv2.THRESH_BINARY) # thresholding 
    mostrarVentana('Binary image', threshImg) 

else: 
    if img is None: 
     print ("Sorry the image path was not valid") 
    else: 
     print ("Sorry the Image was not loaded in BGR; 3-channel format") 
+0

Beim Ändern der Variablennamen kann es zu Tippfehlern kommen. Bitte überprüfen Sie den Code. – ZdaR

+0

Der nächste Fehler erscheint, wenn ich Ihren Code ausführen 'ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwende a.any() oder a.all() ' also ändere ich die if-Bedingung in ' if img.all() und len (img.shape) == 3 und img.shape [2] == 3 : ' Danach habe ich den Pfad zu der JPG-Datei überprüft und es sagt, dass der Pfad ungültig ist. Ich habe sogar das Bild in das gleiche Verzeichnis wie der Python-Quellcode verschoben. – JorgeLopez

+0

Oh Entschuldigung für das fehlende Bild 'img.all()', was den Bildpfad angeht, müssen Sie nach dem 'img = cv2.imread ('RepoImagenes/640x480/P5.jpg ', 1) ', Verwenden Sie immer auch vollständig qualifizierte Pfade wie" C: \ Downloads \ this.png "oder" /Users/yourName/Downloads/this.png " – ZdaR