opencvjava中的掩码图像
我需要将近白色像素转换为白色,将近黑色像素转换为黑色 我在python中找到了一段关于如何实现这一点的代码片段opencvjava中的掩码图像,java,python,numpy,opencv,cv2,Java,Python,Numpy,Opencv,Cv2,我需要将近白色像素转换为白色,将近黑色像素转换为黑色 我在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
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);
我建议使用。此方法可以在矩阵中设置所有he像素。如果指定了可选的掩码参数,则将设置掩码中具有非零值的对应像素的所有像素
因此,python语句
image[mask>0]=(0,0255)
在Java中可替换为:
image.setTo(新标量(0,0255),掩码);
其中,image
必须是Mat
对象。回答问题
正如@rabbi76所提到的,设置为
是正确的方法。但是,如果您需要特定的逻辑,如image[mask>127]=(0,0255)
,则执行阈值(Imgproc.threshold(灰色、灰色、127、255、阈值二进制);
),然后使用设置为
我问题的解决办法
实际上,我的问题不是由于设置为。这是我在代码中读/写Mat与我引用的文章之间的逻辑不匹配
我正在发布我所面临的问题的解决方案,以帮助像我这样的新蜜蜂
图像阅读中的问题
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(位图,src);
修复方法是正确转换格式
Mat src=new Mat(bitmap.getHeight()、bitmap.getWidth()、CV_8UC3)//公告3频道
org.opencv.android.Utils.bitmapToMat(位图,src);
Imgproc.cvtColor(src、hsv、颜色_RGB2HSV)//将RGB转换为HSV。颜色RGBA2HSV不存在,因此我们将其加载到CV_8UC3(3通道R、G、B)中。
图像书写中的问题
同样地,由于我们在bitmapToMat
和imread
之间的读取方面存在差异,因此同样的情况也适用于写入Imgcodecs.imwrite()
会将BGR图像写入位图,我必须将其转换回RGB格式,以便matToBitmap
像Imgproc.cvtColor(RGB,RGB,Imgproc.COLOR\u BGR2RGB)一样工作代码>