java - 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);
解决方案
回答问题
正如@Rabbid76 提到setTo
的那样是正确的方法。但是,如果您想要特定的逻辑image[mask>127]=(0,0,255)
,请执行 threshold( Imgproc.threshold(grey,grey, 127, 255, THRESH_BINARY);
) 然后使用setTo
.
解决我的问题
其实我的问题不是由于setTo
. 这是我在代码中读/写 Mat 的方式与我提到的帖子之间的逻辑不匹配。
我正在发布我遇到的问题的解决方案,以便它可以帮助像我这样的新蜜蜂。
读取图像的问题
该帖子用于Imgcodecs.imread()
以 BGR 格式将图像读取到 Mat。
而我正在使用如下类型加载位图bitmapToMat
,CV_8UC4
它将图像以 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);
推荐阅读
- angular - Angular 中的 Tableau 集成不起作用
- javascript - $FlowExpectedError 有什么作用?
- excel - 确保两个单元格始终具有相同颜色的宏
- database - 如何使用 Oracle SQLPlus 使用 SSH 连接类型连接到数据库?
- c# - 即使有私有字段,也强制使用私有属性?
- sql - 如何以非平凡的顺序对 SQL 输出进行排序?
- perl - 使用 Perl 将字符串加一
- spring - 如何为在 EC2 实例上运行的 Spring Boot 项目配置 AWS RDS?
- postgresql - DB2 到 postgres
- python - 无法使用硒定位元素并确定 ID