2017-09-04 98 views
0

我使用Opencv 3.0只獲取圖像中的彩色對象。因此我創建並使用了一個面具。openCV inRange masking

#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; 
} 

正如你所看到的結果圖像不是預期的一個。只有彩色物體應該保留,因爲它們在蒙版中具有白色背景,但似乎結果圖像是源和蒙版的組合。

有人知道如何解決這個問題嗎?

來源:

Source

面膜:

Mask

結果:

Result

+0

圖片面具https://ibb.co/nyHnbv – GGotpimus

+0

的'copyTo'之前, 'dstImg'全部爲零 - 即全黑。 'copyTo'將只修改蒙版爲白色的區域 - 其餘部分保持原樣,即全黑。 –

回答

0

要了解你的規定─你有一個形象與一些有色對象,在白色的背景下,你基本上想要在黑色背景中包含相同的彩色物體的結果圖像。

如果是這種情況,inRange將無濟於事,因爲您基本上保持灰度值90180之間的閾值,所以您的代碼也會丟棄黑色對象。

爲了確保您獲得掩蔽,只有在白底部分是黑色的,我會建議使用threshold函數來代替,如圖所示:

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

此功能將確保任何像素值在您的灰度圖像上方220將在二進制掩碼中設置爲0。

要疊加的二進制掩碼在源圖像,你應該使用subtract方法,如下所示:

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