繁体   English   中英

opencv java 中的掩码图像

[英]Mask image in opencv java

我需要将接近白色的像素转换为白色,将接近黑色的像素转换为黑色。

我在 python 中找到了有关如何执行此操作的代码片段。

hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
# Define lower and upper limits of what we call "brown"
brown_lo=np.array([10,0,0])
brown_hi=np.array([20,255,255])
# Mask image to only select browns
mask=cv.inRange(hsv,brown_lo,brown_hi)
# Change image to red where we found brown
image[mask>0]=(0,0,255)

我已将其转换为 java,如下所示。

Mat temp= new Mat();
Imgproc.cvtColor(src,temp,COLOR_BGR2HSV);
Scalar low= new Scalar(10,0,0);
Scalar high= new Scalar(20,255,255);
Mat mask = new Mat();
inRange(temp,low,high,mask);

但是我在将以下语句转换为 java 时遇到问题,并且 java 中没有好的 opencv 文档和示例。

image[mask>0]=(0,0,255)

有人可以帮助如何将上述语句转换为 java ...?

我试过 setTo 但它没有给出想要的行为(下面附上截图)。 有关预期结果,请参阅https://stackoverflow.com/a/50215020/12643143

src.setTo(new Scalar(0,0,255),mask);

我建议使用setTo() 此方法可以设置Mat中的所有像素。 如果指定了可选的掩码参数,则将设置掩码中具有非零值的对应像素的所有像素。

因此 python 语句

image[mask>0]=(0,0,255)

可以在 Java 中替换为:

image.setTo(new Scalar(0, 0, 255), mask);

其中image必须是Mat object。

回答问题

正如@Rabbid76 提到的, setTo是正确的方法。 但是,如果您想要特定的逻辑,例如image[mask>127]=(0,0,255) ,则执行阈值( Imgproc.threshold(grey,grey, 127, 255, THRESH_BINARY); ),然后使用setTo

解决我的问题

其实我的问题不是由于setTo 这是我在代码中读/写 Mat 的方式与我提到的帖子之间的逻辑不匹配。

我正在发布我遇到的问题的解决方案,以便它可以帮助像我这样的新蜜蜂。

读取图像的问题

该帖子使用Imgcodecs.imread()以 BGR 格式将图像读取到 Mat 中。

而我正在使用bitmapToMat类型的CV_8UC4加载 bitmap,如下所示,它将图像以 RGBA 格式读取到 Mat。

Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CV_8UC4);
org.opencv.android.Utils.bitmapToMat(bitmap, src);

修复是正确转换格式。

Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CV_8UC3); //notice 3 channel
org.opencv.android.Utils.bitmapToMat(bitmap, src);
Imgproc.cvtColor(src,hsv,COLOR_RGB2HSV); //Convert RGB to HSV. COLOR_RGBA2HSV not exist, hence we load it in CV_8UC3(3 channel R,G,B).

写图有问题

类似地,由于我们在bitmapToMatimread之间的读取存在差异,因此同样适用于写入。 Imgcodecs.imwrite()会将 BGR 图像写入 bitmap,因为我必须将其转换回 RGB 格式以便matToBitmapImgproc.cvtColor(rgb, rgb, Imgproc.COLOR_BGR2RGB);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM