Скелетонизация с алгоритмом Гоу Холла не работает - PullRequest
0 голосов
/ 06 мая 2020

Я хочу проредить / скелетонировать стрелки в img. В основном это нарисованные стрелки, поэтому их толщина может быть разной. Изображение img уже извлечено в мат типа CV_8UC1, и все шумы отфильтрованы. В настоящее время я получаю белый img только при использовании следующего кода:

вызов метода

testing.convertTo(testing,CvType.CV_8UC1);
int rows2 =testing.rows();
int cols2 = testing.cols();
//        mor.convertTo(morphed,CvType.CV_8UC1);
//   Core.multiply(testing, Scalar.all(255.0), testing);
Mat prev = new Mat(rows2, cols2, CvType.CV_8UC1);
Mat diff = new Mat(rows2, cols2, CvType.CV_8UC1);
System.out.println(testing);
do {
    thingouh.thinningGHIterat(testing, 0);
    System.out.println(testing.depth());
    thingouh.thinningGHIterat(testing, 1);
    Core.absdiff(testing, prev, diff);
    System.out.println(testing.depth());
    testing.copyTo(prev);
}
while (Core.countNonZero(diff) > 0);
//Core.multiply(testing, Scalar.all(255.0), testing);
//    Core.divide(testing, Scalar.all(255.0), testing);
System.out.println(testing.type());
HighGui.imshow("HG",testing);

method thinningGHIterat

public void thinningGHIterat(Mat im, int iterations) {

    int rows = im.rows();
    int cols = im.cols();
   //int ch = im.channels();

    Mat marker = new Mat(rows, cols, CvType.CV_8UC1, Scalar.all(0.0));
    System.out.println(marker);
    for (int i = 1; i < rows - 1; i++) {

        for (int j = 1; j < cols - 1; j++) {

            byte p2 = (byte) im.get(i - 1, j)[0];
            byte p3 = (byte) im.get(i - 1, j + 1)[0];
            byte p4 = (byte) im.get(i, j + 1)[0];
            byte p5 = (byte) im.get(i + 1, j + 1)[0];
            byte p6 = (byte) im.get(i + 1, j)[0];
            byte p7 = (byte) im.get(i + 1, j - 1)[0];
            byte p8 = (byte) im.get(i, j - 1)[0];
            byte p9 = (byte) im.get(i - 1, j - 1)[0];

            int C = (~p2 & (p3 | p4)) + (~p4 & (p5 | p6)) + (~p6 & (p7 | p8)) + (~p8 & (p9 | p2));
            int N1 = (p9 | p2) + (p3 | p4) + (p5 | p6) + (p7 | p8);
            int N2 = (p2 | p3) + (p4 | p5) + (p6 | p7) + (p8 | p9);
            int N = N1 < N2 ? N1 : N2;
            int m = iterations == 0 ? ((p6 | p7 | ~p9) & p8) : ((p2 | p3 | ~p5) & p4);

            if (C == 1 && (N >= 2 && N <= 3) & m == 0) {
                marker.put(i, j, 1);
            }
        }
    }

    Core.bitwise_not(marker, marker);
    Core.add(im, marker, im);
}

Я вообще-то не знаю, что нужно одобрить. Даже пытался использовать методы Core.multiply и Core.divide, но ничего не вышло.

Белая стрелка - это то, что я получаю сейчас, и красная тонкая линия внутри должна быть результатом. Текущая стрелка результат (тонкая красная линия) результат

Заранее спасибо.

...