2014-10-06 12 views
7

Mam obraz kolorowy, który chcę próg w OpenCV. Chciałbym, żeby każdy z kanałów RGB poniżej pewnej wartości ustawił wartość we wszystkich kanałach na zero (to jest na czarno).progowanie obrazu RGB w OpenCV

Tak, używam funkcji progowej OpenCV jako:

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

Więc, co myślałem, że to zrobi to, że jeśli którykolwiek z kanału jest mniejsza niż 5, myślałem, że to ustawić je do zera. Jednak wydaje się, że nie działa w ten sposób. Na przykład, widzę, że tylko zielony kanał przechodzi przez niektóre z tych regionów, wskazując, że nie wszystkie kanały są ustawione na 0.

Czy można to osiągnąć za pomocą openCV w szybki sposób?

+0

obcinanie ustawi żadnej wartości poniżej 5 do 0, a każda inna * 255 *. czy tego właśnie chciałeś? – berak

Odpowiedz

15

Możliwe jest progowanie kolorowego obrazu za pomocą funkcji cv::inRange.

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

Na przykład, można zezwolić jedynie valyes między (0, 125, 0) i (255, 200, 255), albo jakieś wartości indivdual kanałów:

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 Widzę, co tam zrobiłeś. – karlphillip

+1

Skończyłem tutaj ponownie, wyszukując w Google hasło "kolor progu opencv". Dobra sztuczka! – karlphillip

1

Krótko mówiąc, musisz podzielić obraz na trzy obrazy zawierające trzy kanały, niezależnie od siebie, a następnie połączyć je ponownie.

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); 

Ten kod powinien to zrobić.

Przepraszam, czytam szybko. Następnie należy zmodyfikować kod nieznacznie po za

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

utworzyć maskę z trzech progowaniu obrazów, a następnie zastosować tę maskę do obrazu wejściowego.

+0

Czy nie stanowi to problemu w tym sensie, że nie wszystkie kanały zostaną ustawione na zero. Zgaduję, że mogę użyć operatora bitwise_AND na obrazie progowym, aby wygenerować ostateczną maskę. – Luca

Powiązane problemy