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 但它没有提供所需的行为(下面附上屏幕截图)。请参阅 以获得预期结果。
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
对象。
问题的答案
正如@Rabbid76 提到的那样,setTo
是执行此操作的正确方法。但是,如果您想要像 image[mask>127]=(0,0,255)
这样的特定逻辑,则执行阈值 (Imgproc.threshold(grey,grey, 127, 255, THRESH_BINARY);
) 然后使用 setTo
.
解决我的问题
其实我的问题不是因为setTo
。这是我 read/write 我代码中的 Mat 与我引用的 post 之间的逻辑不匹配。
我正在 post 解决我所面临的问题,以便它可以帮助像我这样的新蜜蜂。
读取图像时出现问题
post 使用 Imgcodecs.imread()
以 BGR 格式将图像读取到 Mat。
而我在 CV_8UC4
中使用 bitmapToMat
加载位图,如下所示,它以 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).
写入图像时出现问题
bitmapToMat
和imread
在阅读上也有差异,同样适用于写作。 Imgcodecs.imwrite()
会将 BGR 图像写入位图,因为我必须将其转换回 RGB 格式才能使 matToBitmap
像 Imgproc.cvtColor(rgb, rgb, Imgproc.COLOR_BGR2RGB);
一样工作
我需要将接近白色的像素转换为白色,将接近黑色的像素转换为黑色。
我在 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 但它没有提供所需的行为(下面附上屏幕截图)。请参阅 以获得预期结果。
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
对象。
问题的答案
正如@Rabbid76 提到的那样,setTo
是执行此操作的正确方法。但是,如果您想要像 image[mask>127]=(0,0,255)
这样的特定逻辑,则执行阈值 (Imgproc.threshold(grey,grey, 127, 255, THRESH_BINARY);
) 然后使用 setTo
.
解决我的问题
其实我的问题不是因为setTo
。这是我 read/write 我代码中的 Mat 与我引用的 post 之间的逻辑不匹配。
我正在 post 解决我所面临的问题,以便它可以帮助像我这样的新蜜蜂。
读取图像时出现问题
post 使用 Imgcodecs.imread()
以 BGR 格式将图像读取到 Mat。
而我在 CV_8UC4
中使用 bitmapToMat
加载位图,如下所示,它以 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).
写入图像时出现问题
bitmapToMat
和imread
在阅读上也有差异,同样适用于写作。 Imgcodecs.imwrite()
会将 BGR 图像写入位图,因为我必须将其转换回 RGB 格式才能使 matToBitmap
像 Imgproc.cvtColor(rgb, rgb, Imgproc.COLOR_BGR2RGB);