2014-10-06 15 views
7

Ich habe ein Farbbild, das ich in OpenCV Schwelle möchte. Was ich möchte ist, dass, wenn einer der RGB-Kanäle unter einem bestimmten Wert, um den Wert in allen Kanälen auf Null (d. H. Schwarz).Thresholding RGB-Bild in OpenCV

So verwende ich die opencv Schwellenfunktion wie:

cv::Mat frame, thresholded 
// read frame somewhere, it is a BGR image. 
cv::threshold(frame, thresholded, 5, 255, cv::THRESH_BINARY); 

Also, was ich dachte, dies tun würde, ist, dass, wenn eine der Kanal weniger als 5 ist, dachte ich, es ihnen auf Null gesetzt würde. Es scheint jedoch nicht so zu funktionieren. Zum Beispiel sehe ich nur den grünen Kanal für einige dieser Bereiche, was anzeigt, dass nicht alle Kanäle auf 0 gesetzt sind.

Gibt es einen Weg, dies schnell mit openCV zu erreichen?

+0

Schwellwertbildung wird beliebigen Wert unterhalb von 5 auf 0 gesetzt und * andere auf 255 *. ist das, was du wolltest? – berak

Antwort

15

Es ist möglich, ein farbiges Bild mit der Funktion cv::inRange zu schwellen.

void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst) 

Zum Beispiel können Sie nur valyes zwischen (0, 125, 0) und (255, 200, 255) oder beliebige Werte für indivdual Kanäle ermöglichen:

cv::Mat image = cv::imread("bird.jpg"); 

if (image.empty()) 
{ 
    std::cout << "> This image is empty" << std::endl; 
    return 1; 
} 

Original image

cv::Mat output; 
cv::inRange(image, cv::Scalar(0, 125, 0), cv::Scalar(255, 200, 255), output); 
cv::imshow("output", output); 

Output image

+0

+1 Ich sehe was du da gemacht hast. – karlphillip

+1

Beendet hier wieder, indem Sie in Google nach "opencv threshold color" suchen. Guter Trick! – karlphillip

1

Kurz gesagt, müssen Sie Ihr Bild in drei Bildern mit den drei Kanälen aufnehmen, sie unabhängig voneinander halten und dann wieder zusammenführen.

Mat frame,thresholded; 
vector<Mat> splited_frame; 
//Read your frame 
split(frame, splited_frame); 
for (size_t i = 0; i < splited_frame.size(); i++) 
    threshold(splited_frame[i], splited_frame[i], 5, 255, cv::THRESH_BINARY); 
merge(splited_frame,thresholded); 

Dieser Code sollte es tun.

Entschuldigung, ich lese zu schnell. Dann sollten Sie den Code leicht nach dem für

thresholded = splited_frame[0].clone(); 
for(size_t i = 1; i < splited_frame.size(); i++) thresholded &= splited_frame[i]; 
frame &= thresholded; 

ändern Sie eine Maske aus den schwellen Bilder drei schaffen, dann diese Maske auf Ihre Eingabe Bild anwenden.

+0

Hat dies jedoch kein Problem in dem Sinne, dass nicht alle Kanäle auf Null gesetzt werden. Ich schätze, dass ich einen bitwise_AND-Operator auf dem Schwellenwertbild verwenden kann, um die letzte Maske zu erzeugen. – Luca