根据connectComponentsWithStats的结果,替换Mat对象中像素值的最有效方法是什么?

时间:2018-06-21 06:52:03

标签: java arrays opencv matrix memory-management

我尝试根据图像的面积在图像中保留连接的像素。目前,我正在使用connectedComponentsWithStats查找连接的像素及其区域。使用连接的组件的结果,我检查该区域是否在阈值内。如果是的话,我将像素转换为黑色,否则转换为白色。这是我用来执行此转换的代码。

    int labelCount = connectedComponentsWithStats(thresholdedImage, labels, stats, centroids);
    final UByteRawIndexer outputIndxr = thresholdedImage.createIndexer();
    labels.reshape(1,1).convertTo(intMat, CV_32S);
    final IntRawIndexer labelsIndxr = labels.createIndexer();
    final IntRawIndexer statsIndxr = stats.createIndexer();
    ArrayList<Integer> labelList = new ArrayList<>();

    for (int i=1; i<labelCount; i++) {
        if(statsIndxr.get(i, CC_STAT_AREA) > 1000) {
            labelList.add(i);
        }
    }

    Parallel.loop(0,(int) labelsIndxr.rows(), new Parallel.Looper() {
        public void loop(int from, int to, int looperID) {
            for (int i = 0; i < labelsIndxr.rows(); i++) {
                for (int j = 0; j < labelsIndxr.cols(); j++) {
                    try {
                        if(labelList.contains(labelsIndxr.get(i, j))) {
                            outputIndxr.put(i, j, 0, (byte) 255);
                            outputIndxr.put(i, j, 1, (byte) 255);
                            outputIndxr.put(i, j, 2, (byte) 255);
                        } else {
                            outputIndxr.put(i, j, 0, (byte) 0);
                            outputIndxr.put(i, j, 1, (byte) 0);
                            outputIndxr.put(i, j, 2, (byte) 0);
                        }
                    } catch (Exception ignore) {}
                }
            }
    }});

尽管此代码可以正常工作,但运行此位时会占用大量内存和CPU。有没有更快或更有效的方法来做到这一点?我正在寻找在Java中执行此操作的等效代码。

nb_components, output, stats, centroids = 
cv2.connectedComponentsWithStats(img, connectivity=8)
sizes = stats[1:, -1]; nb_components = nb_components - 1

min_size = 150  

img2 = np.zeros((output.shape))
for i in range(0, nb_components):
  if sizes[i] >= min_size:
    img2[output == i + 1] = 255

0 个答案:

没有答案