2017-09-04 2 views
0

J'utilise Opencv 3.0 pour obtenir uniquement les objets colorés dans une image. Par conséquent, je crée et utilise un masque.OpenCV inRange masquage

#include <opencv2\opencv.hpp> 

using namespace cv; 
using namespace std; 

int main() 
{ 
    namedWindow("Display", CV_WINDOW_AUTOSIZE); 
    namedWindow("Orignial", CV_WINDOW_AUTOSIZE); 
    namedWindow("Mask", CV_WINDOW_AUTOSIZE); 

    // First load your image 
    Mat mSrc = imread("IMG_0005_AUSZUG2.png", CV_LOAD_IMAGE_COLOR); 
    Mat mGray = Mat::zeros(mSrc.size(), mSrc.type()); 
    cvtColor(mSrc, mGray, CV_BGR2GRAY); 

    // define your mask 
    Mat mask = Mat::zeros(mSrc.size(), mSrc.type()); 

    // define destination image 
    Mat dstImg = Mat::zeros(mSrc.size(), mSrc.type()); 

    //finding mask 
    inRange(mSrc, Scalar(90, 90, 90), Scalar(180, 180, 180), mask); 

    // combination of mask and Source image 
    dilate(mask, mask, Mat(), Point(-1, -1)); 
    bitwise_not(mask, mask); 
    //cvtColor(mask, mask, CV_GRAY2BGR); 
    mSrc.copyTo(dstImg, mask); 
    //bitwise_and(mSrc, mSrc, dstImg, mask); 

    imshow("Mask", mask); 
    imshow("Orignial", mSrc); 
    imshow("Display", dstImg); 

    waitKey(0); 
    return 0; 
} 

Comme vous pouvez le voir l'image de résultat n'est pas l'image voulue. Seuls les objets colorés doivent rester, car ils ont un fond blanc dans le masque, mais il semble que l'image résultante soit une combinaison de source et de masque.

Quelqu'un sait-il comment résoudre ce problème?

Source:

Source

Masque:

Mask

Résultat:

Result

+0

Image du masque https://ibb.co/nyHnbv – GGotpimus

+0

Avant la 'copyTo', 'dstImg' est tout zéros - c'est-à-dire tout noir. 'copyTo' ne modifiera que les zones où le masque est blanc - le reste reste tel qu'il était avant, c'est-à-dire tout en noir. –

Répondre

0

Pour comprendre votre requirement- vous avez une image avec quelques objets de couleur dedans, dans un fond blanc, et vous voulez essentiellement une image de résultat contenant les mêmes objets colorés dans un fond noir à la place.

Si tel est le cas, inRange ne va pas aider parce que vous avez essentiellement entre le seuil gardé valeurs de gris 90 et 180, de sorte que votre code défausser des objets sombres aussi bien.

Pour vous assurer d'obtenir un masque qui est noir que dans les régions de fond blanc, je suggère d'utiliser la place fonction threshold, comme le montre:

//finding mask 
//inRange(mSrc, Scalar(90, 90, 90), Scalar(180, 180, 180), mask); 
threshold(mGray, mask, 220, 255, THRESH_BINARY_INV); 

Cette fonction fera en sorte que toute valeur de pixel dans votre image en niveaux de gris au-dessus de 220 sera mis à 0 dans le masque binaire.

Pour incruster le masque binaire sur l'image source, vous devez utiliser la méthode subtract, comme le montre:

cvtColor(mask,mask,CV_GRAY2BGR);//change thresh to a 3 channel image 

Mat mResult = Mat::zeros(mSrc.size(), mSrc.type()); 

subtract(mask,mSrc,mResult); 
subtract(mask,mResult,mResult);