为什么我的 BGR2GRAY Mat returns 在基本阈值函数中呈蓝色? [开放简历]
Why my BGR2GRAY Mat returns a color blue in a basic threshold function? [OPENCV]
我是 Whosebug 的新手,如果我做错了,我对我的格式深表歉意(请不要犹豫,告诉我要修复此线程的哪些内容)。
我正在尝试从原始图片创建图像分割,它 returns 白色背景和绿色叶子的蓝色。我原以为该函数会出现黑白像素,但我真的不知道我是否做对了。
我想使用 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 这会造成问题。
我还应该阅读更多文档。
我真的应该感谢 Whosebug 中积极帮助人们的人们。我喜欢这个地方<3
imread 的标志似乎是错误的。我觉得应该是IMREAD_GRAYSCALE from Imgcodecs the BGR2GRAY
is for the function cvtColor
应该是
Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);
更新:
您可能需要在位图之前将其转换为 RGBA(可能是错误?)
Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);
根据@api55 的回答,我两种都试过了,同时执行 imread as LOAD_IMAGE_GRAYSCALE 和 CvtColor 函数太过分了。但是它们中的任何一个都有效。 ColorMatrix 也是一个不错的选择。感谢@ModularSynth。
它们都有效(来自@api55's)
Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);
和
Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);
我是 Whosebug 的新手,如果我做错了,我对我的格式深表歉意(请不要犹豫,告诉我要修复此线程的哪些内容)。
我正在尝试从原始图片创建图像分割,它 returns 白色背景和绿色叶子的蓝色。我原以为该函数会出现黑白像素,但我真的不知道我是否做对了。
我想使用 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 这会造成问题。 我还应该阅读更多文档。
我真的应该感谢 Whosebug 中积极帮助人们的人们。我喜欢这个地方<3
imread 的标志似乎是错误的。我觉得应该是IMREAD_GRAYSCALE from Imgcodecs the BGR2GRAY
is for the function cvtColor
应该是
Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);
更新:
您可能需要在位图之前将其转换为 RGBA(可能是错误?)
Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);
根据@api55 的回答,我两种都试过了,同时执行 imread as LOAD_IMAGE_GRAYSCALE 和 CvtColor 函数太过分了。但是它们中的任何一个都有效。 ColorMatrix 也是一个不错的选择。感谢@ModularSynth。
它们都有效(来自@api55's)
Mat imageSegmentationMat = Imgcodecs.imread(originalFilePathStr, Imgcodecs.IMREAD_GRAYSCALE);
和
Imgproc.cvtColor(imageSegmentationMat, tmp, Imgproc.COLOR_GRAY2RGBA, 4);