根据源图像

时间:2016-06-09 08:12:12

标签: java image

我从文件夹中的图像列表中读取,然后从图像中裁剪并分割字符。然后,创建的文件将保存到具有新名称的另一个文件夹。例如,第一个源图像(image1)我已经分割了7个新的角色图像,然后继续下一个图像。

我的问题是我如何根据它们的源图像重新组合这些图像,如分配它们(im01-im07来自源图像1)等等。这是代码:

for (int sf = 0; sf < listOfSrcFFiles.length; sf++) {
    File imgFile = listOfSrcFFiles[sf];
    String fileName = imgFile.getName();
    if (fileName.equals("Thumbs.db")) {
        imgFile.delete();   
    } else {
        try{
            Mat img_grayROI = Highgui.imread(imgFile.getAbsolutePath(), Highgui.CV_LOAD_IMAGE_GRAYSCALE);
            Rect roi = new Rect(300, 200, 450, 200);
            Mat cropped = new Mat(img_grayROI, roi);

            Imgproc.threshold(cropped, cropped, 0, 255, Imgproc.THRESH_BINARY + Imgproc.THRESH_OTSU);

            Point shift = new Point(0, 150);
            Mat result = cropped;

            List<MatOfPoint> contours = new ArrayList<MatOfPoint>();


            Imgproc.findContours(result, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            Imgproc.floodFill(result, new Mat(), shift, new Scalar(255, 0, 0));

            Core.bitwise_not(result, result);

            for (int i = 0; i < contours.size(); i++) {
                if (Imgproc.contourArea(contours.get(i)) > 50) {
                    Rect rect = Imgproc.boundingRect(contours.get(i));

                    /*if (rect.height > 25 && rect.height < 50 && rect.width > 10 && rect.width < 50) {*/
                    if (rect.height > 25 && rect.width < 25) {
                        Core.rectangle(result, rect.tl(), rect.br(), new Scalar(0, 0, 0));

                        Mat crop = new Mat(result, rect);
                        Highgui.imwrite(tmpFolder + fSprator + sf + "" + i + ".bmp", crop);
                    }
                }

            }
        }catch(Exception e){

        }
    }
}

这样我以后可以将它们保存到文本文件中,并根据它们的源图像名称将它们分开。

谢谢你,非常感谢。

1 个答案:

答案 0 :(得分:0)

最干净的解决方案是创建一个bean来保存结果。

例如:

public class TransformResult {
    private File input;
    private List<File> transformedFiles = new ArrayList<>();

    // getters / setters
}

public List<TransformResult> doTransform(File listOfSrcFFiles) {
    List<TransformResult> results = new ArrayList<>();
    for (File srcFile : listOfSrcFFiles) {
        if (...) {
           TransformResult result = new TransformResult(srcFile);
           for (...) {
              if (...) {
                  File transformed = doSomeTransformation(srcFile);
                  result.getTransformedFiles().add(transformed);
              }
           }
           results.add(result);
        }
    }
    return results;
}