我是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
答案 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
所以它应该是
Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);
更新:
您可能需要在位图之前将其转换为RGBA(可能是错误?)
Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);