J'ai une image couleur que je veux à un seuil dans OpenCV. Ce que je voudrais, c’est que si l’un des canaux RVB se trouve sous une certaine valeur, définissez la valeur de tous les canaux sur zéro (c’est-à-dire le noir).
Donc, j'utilise la fonction de seuil d'openv comme:
cv::Mat frame, thresholded
// read frame somewhere, it is a BGR image.
cv::threshold(frame, thresholded, 5, 255, cv::THRESH_BINARY);
Donc, ce que je pensais que cela ferait, c'est que si un des canaux est inférieur à 5, je pensais que cela les mettrait à zéro. Cependant, cela ne semble pas fonctionner de cette façon. Par exemple, je ne vois que le canal vert passer pour certaines de ces régions, indiquant que tous les canaux ne sont pas réglés sur 0.
Existe-t-il un moyen d'y parvenir rapidement avec OpenCV?
Il est possible de définir une image colorée en utilisant la fonction cv::inRange
.
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
Par exemple, vous ne pouvez autoriser que les valeurs comprises entre (0, 125, 0) et (255, 200, 255), ou n'importe quelle valeur pour des canaux individuels:
cv::Mat image = cv::imread("bird.jpg");
if (image.empty())
{
std::cout << "> This image is empty" << std::endl;
return 1;
}
cv::Mat output;
cv::inRange(image, cv::Scalar(0, 125, 0), cv::Scalar(255, 200, 255), output);
cv::imshow("output", output);
En bref, vous devez glisser votre image dans trois images contenant les trois canaux, les conserver trois séparément, puis les fusionner à nouveau.
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);
Ce code devrait le faire.
Désolé, j'ai lu trop vite. Ensuite, vous devriez modifier le code légèrement après le for
thresholded = splited_frame[0].clone();
for(size_t i = 1; i < splited_frame.size(); i++) thresholded &= splited_frame[i];
frame &= thresholded;
Vous créez un masque à partir des trois images à seuil, puis appliquez ce masque à votre image d'entrée.