为什么我的BGR2GRAY Mat在基本阈值函数中返回蓝色? [OPENCV]

时间:2017-08-30 10:35:52

标签: java android opencv threshold

我是stackoverflow的新手,如果我做错了,我真诚地为我的格式道歉(请不要犹豫,告诉我们要解决这个问题)。

我正在尝试从原始图片创建图像分割,它为绿叶返回白色背景和蓝色。我期待这个功能的黑白像素,我真的不知道我做得对。

我想使用BGR2GRAY Mat对象作为原始对象的标记,尝试将叶子与背景分开。这是我的代码。

    // IMAGE SEGMENTATION USING WATERSHED ALGORITHM //
    //Create a Mat Object using originalPicture as is:

    //Create an instance of Mat Object using originalPicture as BGR2GRAY:
    Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgproc.COLOR_BGR2GRAY);
    //Use basic threshold for imageSegmentationMat:
    Imgproc.threshold(originalPicMat,imageSegmentationMat, 86,255, Imgproc.THRESH_BINARY);
    //test:
    Bitmap imageSegmentationBmp = Bitmap.createBitmap(imageSegmentationMat.cols(), imageSegmentationMat.rows(),Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(imageSegmentationMat, imageSegmentationBmp);
    imgView_segmentation.setImageBitmap(imageSegmentationBmp);

我期待得到的只是我在OpenCV教程中看到的黑白。任何人都可以通过解释发生的事情来帮助我吗?谢谢。

这是我输出的截图: http://imageshack.com/a/img924/8520/qPaMdX.png

更新: 我忘了告诉我正在关注this关于图像分割的教程,这一行是我遇到问题的地方:

ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

我只需将其转换为java(该教程是用phyton编写的,我对它一无所知,虽然它看起来很容易阅读)这里是我的:

Imgproc.threshold(grayscaleMat,testThresholdMat,0,255, Imgproc.THRESH_BINARY_INV+Imgproc.THRESH_OTSU);

所以回答我的问题: 我的阈值函数缺少THRESH_OTSU,这会产生问题。 而且我还应该阅读更多文档。

我真的要感谢stackoverflow中的人们积极帮助人们。我爱这个地方< 3

2 个答案:

答案 0 :(得分:2)

从@ api55&#39的回答中,我尝试了两种方法,并且将其作为LOAD_IMAGE_GRAYSCALE和CvtColor函数进行imread是一种过度杀伤力。但他们中的任何一个都有效ColorMatrix也可以是一个很好的选择。归功于@ModularSynth。

它们都有效(来自@ api55' s)

Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);

Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);

答案 1 :(得分:1)

imread的标志似乎是错误的。我认为IMREAD_GRAYSCALE from Imgcodecs BGR2GRAY对于函数cvtColor

应该是{{3}}

所以它应该是

Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);

更新:

您可能需要在位图之前将其转换为RGBA(可能是错误?)

Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);