Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的BGR2GRAY Mat在基本阈值函数中返回蓝色?[OPENCV]_Java_Android_Opencv_Threshold - Fatal编程技术网

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

Java 为什么我的BGR2GRAY Mat在基本阈值函数中返回蓝色?[OPENCV],java,android,opencv,threshold,Java,Android,Opencv,Threshold,我是stackoverflow新手,如果我做错了,我真诚地为我的格式道歉(请毫不犹豫地告诉我如何修复此线程) 我试图从原始图片创建一个图像分割,它返回白色背景和绿色叶子的蓝色。我期待从函数中得到黑白像素,但我真的不知道我是否做得对 我想使用BGR2GRAY Mat对象作为原始对象的标记,尝试将叶子与背景分开。这是我的密码 // IMAGE SEGMENTATION USING WATERSHED ALGORITHM // //Create a Mat Object using o

我是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教程中看到的。有人能帮我解释一下发生了什么事吗?多谢各位

以下是我的输出的屏幕截图:

更新: 我忘了告诉大家我在学习关于图像分割的教程,这一行就是我遇到问题的地方:

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,这就产生了问题。 我还应该阅读更多的文档


我真的应该感谢这里积极帮助人们的人们。我爱这个地方imread的旗帜似乎是错误的。我认为应该是
BGR2GRAY
用于函数

应该如此

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

您可能需要在位图之前将其转换为RGBA(可能有bug?)


根据@api55的回答,我尝试了这两种方法,但将imread作为LOAD_IMAGE_GRAYSCALE和CvtColor函数都使用是一种过分的做法。但它们中的任何一个都有效。ColorMatrix也是一个不错的选择。归功于@ModularSynth

它们都能工作(来自@api55's)


您甚至不需要修改openCV就可以将彩色图像转换为灰度图像。一个“谦逊”的色彩矩阵能很好地完成这个任务。哇,实际上我对android开发也是新手。你推荐的实际上很有用。我想我无法理解图像处理也是我把事情搞砸的原因之一。我真的很欣赏你的洞察力。我希望你能进一步解释如何解决我的问题(如果我发布的内容对于这样的论坛来说是可以理解的话)。不过,我真的很感激。嗯,没有人已经开始学习了。我想说。。。谷歌搜索android colormatrix,发现通过使用不同的矩阵变换图像颜色空间是多么快速和简单。乌贼墨色调,亮度,红色素,灰阶。。。你说得对,哎呀!我指的是正色(两种颜色:全黑或全白),还有更多:R、G、B分离,负片。。。另外,你可以将其中的几个组合起来,获得更多的效果(例如:增强亮度/对比度的倒灰度、红色或任何其他颜色的深褐色色调,而不是经典的米色等)。他还将8位单通道图像写入4位4通道图像(
8UC1
to
Bitmap.Config.ARGB_8888
)。我猜问题可能就在这里。@Zindarod我也想到了这一点,但文档中说它可以接受这一点作为输入,并且不会对不同的位大小设置任何限制,所以我不确定它是否真的尝试过这个,尽管我也认为这是问题之一。我还是得到了同样的结果。我认为你们关于位图转换的看法也是正确的。如果你们能告诉我如何将位图转换为灰度(因为这是我看到结果的地方,我无法检查imageSegmentationMat对象本身),或者如果你们能告诉我如何使用蓝色作为遮罩(如果可以的话),我会非常感激。然后我将检查您的答案并进行编辑,以便帮助可能遇到此问题的其他人。@Jepoy使用我的答案中提到的cvtcolor函数,可以将其转换为RGBA。我更新了我的答案,试着看看它是否有效(tmp是一个同样大小的垫子)@api55:关于IMREAD_灰度,你实际上是对的。虽然我的问题来自阈值函数本身。我真诚地感谢你对我的帮助。我很感激。
Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);
Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);
Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);