Как я могу обнаружить патч на полосе изображения? - PullRequest
0 голосов
/ 08 марта 2020

Я обнаруживаю квадраты патчей на изображении полосы

Я думаю, что границы не ясны

Как я могу получить эти патчи четко

, пожалуйста, помогите мне

это мой код и изображения

Спасибо


Код

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.src2);
//        bmp = changeBitmapContrastBrightness(bmp, (float)1.5, 0);

        Mat src = new Mat();
        Utils.bitmapToMat(bmp, src);

        // Creating an empty matrix to store the result
        Mat dst = new Mat();

        // Creating kernel matrix
        Mat kernel = Mat.ones(1,1, CvType.CV_32F);

        for(int i = 0; i<kernel.rows(); i++) {
            for(int j = 0; j<kernel.cols(); j++) {
                double[] m = kernel.get(i, j);

                for(int k = 1; k<m.length; k++) {
                    m[k] = m[k]/(2 * 2);
                }
                kernel.put(i,j, m);
            }
        }
        Imgproc.filter2D(src, dst, -1, kernel);

        Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2GRAY);

        // Preparing the kernel matrix object
        Mat kernel1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,
                new  Size((2*2) + 1, (2*2)+1));
        Imgproc.dilate(dst, dst, kernel1);

        Imgproc.threshold(dst, dst, 160, 255, Imgproc.THRESH_BINARY);

        // Creating kernel matrix
        Mat kernel2 = Mat.ones(5,5, CvType.CV_32F);
        Imgproc.morphologyEx(dst, dst, Imgproc.MORPH_OPEN, kernel2);
}
private static List<MatOfPoint> contourFind(Mat img){
        List<MatOfPoint> contours = new ArrayList<>();
        Imgproc.findContours(img, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

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

        for(MatOfPoint cnt: contours){
            MatOfPoint2f curve = new MatOfPoint2f(cnt.toArray());
            MatOfPoint2f approxCurve = new MatOfPoint2f();
            Imgproc.approxPolyDP(curve, approxCurve, 0.02 * Imgproc.arcLength(curve, true), true);

            int numberVertices = (int) approxCurve.total();

            double contourArea = Imgproc.contourArea(cnt);

            if (Math.abs(contourArea) < img.size().area() / 10){
                squares.add(cnt);
            }
        }

        return squares;
    }

Исходное изображение

введите описание изображения здесь


после обработки изображения

введите описание изображения здесь

1 Ответ

0 голосов
/ 08 марта 2020

Возможно, вы захотите взглянуть на некоторый алгоритм сегментации и обучить вашу модель на основе образцов изображений для каждой категории. Существуют такие алгоритмы, как алгоритм Watershed для классического машинного обучения. Или посмотрите на сегментацию semanti c, если вы можете использовать глубокое обучение и нейронные сети.

...