我尝试根据图像的面积在图像中保留连接的像素。目前,我正在使用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