在OpenCV4Android中,我可以从垫子上移除一些特定的像素吗?

在OpenCV4Android中,我可以从垫子上移除一些特定的像素吗?,android,opencv,opencv3.0,mat,opencv4android,Android,Opencv,Opencv3.0,Mat,Opencv4android,例如,假设我想从垫子上移除位于(50,50)的像素。我可以移除它吗 某些上下文: 我有一个包含轮廓的Mat。我想做的是遍历Mat中的每个像素,我想删除每个不在轮廓内的像素,这样我只剩下位于轮廓内的Mat部分。可能吗 所以我在做什么 for (int firstCoordinate = 0; firstCoordinate < hsvMat.rows(); firstCoordinate++) {//This and nested for are used to iterate throug

例如,假设我想从垫子上移除位于
(50,50)
的像素。我可以移除它吗

某些上下文:

我有一个包含轮廓的
Mat
。我想做的是遍历
Mat
中的每个像素,我想删除每个不在轮廓内的像素,这样我只剩下位于轮廓内的
Mat
部分。
可能吗

所以我在做什么

for (int firstCoordinate = 0; firstCoordinate < hsvMat.rows(); firstCoordinate++) {//This and nested for are used to iterate through the Mat
    for (int secondCoordinate = 0; secondCoordinate < hsvMat.cols(); secondCoordinate++) {
        if (Imgproc.pointPolygonTest(contour, new Point(firstCoordinate, secondCoordinate), false) < 0) {//If this point is outside the contour. 
            //***HERE:I want to remove this pixel. 
           //****SOMETHING LIKE:
           //***hsvMat.get(firstCoordinate,secondCoordinate).remove();
        }
    }
}
我们得到

然后通过执行
Imgproc.cvtColor(detectedBlobRgba、detectedBlobHsv、Imgproc.COLOR\u RGB2HSV),我们得到

然后当我这样做时

//CALCULATING THE AVERAGE COLOR OF THE DETECTED BLOB
int pixelsRemoved = 0;
for (int firstCoordinate = 0; firstCoordinate < detectedBlobHsv.rows(); firstCoordinate++) {
    for (int secondCoordinate = 0; secondCoordinate < detectedBlobHsv.cols(); secondCoordinate++) {
        if (Imgproc.pointPolygonTest(largestContour2f,new Point(firstCoordinate, secondCoordinate),false) == -1) {
            pixelsRemoved++;
            detectedBlobHsv.put(firstCoordinate, secondCoordinate, new double[]{0,0,0});
        }
    }
}
//计算检测到的斑点的平均颜色
int pixelsRemoved=0;
对于(int firstCoordinate=0;firstCoordinate
然后它就出错了。这是我将
detectedBlobHsv
写入SD卡时得到的结果(在左边缘只有一条红色垂直线=/)


简单的回答是:不,你不能从图像中删除像素。你能做的(我猜,你想要的)是改变他们的价值观。看一看如何在opencv中使用掩码,您希望实现什么?透明像素?不用于计算某些信息的像素?节省内存?还有别的吗?根据应用程序的不同,还可以实现另外一个功能…@mika“不会用于计算某些信息的像素?”-这!我需要计算轮廓内
Mat
区域的平均HSV颜色。此代码段适用于整个
Mat
(但我只需要对轮廓内的区域执行此操作):
Scalar detectedblobhscvolor=new Scalar(255);detectedBlobHsvColor=Core.sumElems(detectedBlobHsv);int pointCount=detectedBlobHsv.width()*detectedBlobHsv.height();对于(int i=0;i
这通常通过使用掩码来完成。但不幸的是,Core.sumElems不支持掩码!可以执行的操作:为每个删除的点将h(sv)值设置为0(00)。那么所有元素的总和就不会被它们改变。为了计算平均值,现在必须除以n-m,其中n是总图像大小,m是移除的像素数!简单的回答是:不,你不能从图像中删除像素。你能做的(我猜,你想要的)是改变他们的价值观。看一看如何在opencv中使用掩码,您希望实现什么?透明像素?不用于计算某些信息的像素?节省内存?还有别的吗?根据应用程序的不同,还可以实现另外一个功能…@mika“不会用于计算某些信息的像素?”-这!我需要计算轮廓内
Mat
区域的平均HSV颜色。此代码段适用于整个
Mat
(但我只需要对轮廓内的区域执行此操作):
Scalar detectedblobhscvolor=new Scalar(255);detectedBlobHsvColor=Core.sumElems(detectedBlobHsv);int pointCount=detectedBlobHsv.width()*detectedBlobHsv.height();对于(int i=0;i
这通常通过使用掩码来完成。但不幸的是,Core.sumElems不支持掩码!可以执行的操作:为每个删除的点将h(sv)值设置为0(00)。那么所有元素的总和就不会被它们改变。为了计算平均值,现在必须除以n-m,其中n是总图像大小,m是移除的像素数!
//CALCULATING THE AVERAGE COLOR OF THE DETECTED BLOB
int pixelsRemoved = 0;
for (int firstCoordinate = 0; firstCoordinate < detectedBlobHsv.rows(); firstCoordinate++) {
    for (int secondCoordinate = 0; secondCoordinate < detectedBlobHsv.cols(); secondCoordinate++) {
        if (Imgproc.pointPolygonTest(largestContour2f,new Point(firstCoordinate, secondCoordinate),false) == -1) {
            pixelsRemoved++;
            detectedBlobHsv.put(firstCoordinate, secondCoordinate, new double[]{0,0,0});
        }
    }
}