【问题标题】:Mask image in opencv javaopencv java中的蒙版图像
【发布时间】:2020-10-24 17:43:18
【问题描述】:

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

我在python中找到了一个代码sn-p,说明如何做到这一点。

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);

【问题讨论】:

    标签: java python numpy opencv cv2


    【解决方案1】:

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

    因此是python语句

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

    在 Java 中可以替换为:

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

    其中image 必须是Mat 对象。

    【讨论】:

      【解决方案2】:

      回答问题

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

      解决我的问题

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

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

      图片读取问题

      帖子使用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).
      

      图像写入问题

      同样,bitmapToMatimread 在阅读上存在差异,同样适用于写作。 Imgcodecs.imwrite() 会将 BGR 图像写入位图,因为我必须将其转换回 RGB 格式,matToBitmap 才能像 Imgproc.cvtColor(rgb, rgb, Imgproc.COLOR_BGR2RGB); 一样工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 2012-05-15
        • 1970-01-01
        相关资源
        最近更新 更多