Сглаживание неровностей контура

На днях я участвовал в потоке Изображение / Графика в форму и сделал хакерскую попытку получить контур изображения, добавляя Прямоугольник итеративно в область . Это было очень медленно.

В этом примере вместо этого создается GeneralPath и создается область из GP. Намного быстрее.

Sample images for processing

Изображение в верхнем левом углу является «исходным изображением». Два справа - это разные стадии обработки контура. Оба они имеют неровные края по кругу и по наклонным сторонам треугольника.

Я хотел бы получить форму, в которой эта неровность удалена или уменьшена.

В ASCII art.

Случай 1:

  1234
1 **
2 **
3 ***
4 ***
5 ****
6 ****

Углы находятся в:

  • (2,3) внутренний угол
  • (3,3)
  • (3,5) внутренний угол
  • (4,5)

Случай 2:

  1234
1 ****
2 ****
3 **
4 **
5 ****
6 ****

Углы находятся в:

  • (4,2)
  • ( 2,2) внутренний угол
  • (2,5) внутренний угол
  • (4,5)

Предполагая, что наш путь имел показанные формы и точки, как указано, я бы хотел опустить 'внутренний угловые точки первого набора, сохраняя при этом «пару» внутренних углов (часть изображения) для второго.


  • Может ли кто-нибудь предложить какой-нибудь умный встроенный метод для выполнения тяжелой работы в этой работе?
  • ] В противном случае, что было бы хорошим подходом к определению местоположения и характера (пара / одиночный) внутренних углов? (Полагаю, я мог бы получить PathIterator и построить новый GeneralPath , отбрасывая особые внутренние углы - если бы я только мог понять, как их идентифицировать!)

Вот код для игры:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;

/* Gain the outline of an image for further processing. */
class ImageOutline {

    private BufferedImage image;

    private TwoToneImageFilter twoToneFilter;
    private BufferedImage imageTwoTone;
    private JLabel labelTwoTone;

    private BufferedImage imageOutline;
    private Area areaOutline = null;
    private JLabel labelOutline;

    private JLabel targetColor;
    private JSlider tolerance;

    private JProgressBar progress;
    private SwingWorker sw;

    public ImageOutline(BufferedImage image) {
        this.image = image;
        imageTwoTone = new BufferedImage(
            image.getWidth(),
            image.getHeight(),
            BufferedImage.TYPE_INT_RGB);
    }

    public void drawOutline() {
        if (areaOutline!=null) {
            Graphics2D g = imageOutline.createGraphics();
            g.setColor(Color.WHITE);
            g.fillRect(0,0,imageOutline.getWidth(),imageOutline.getHeight());

            g.setColor(Color.RED);
            g.setClip(areaOutline);
            g.fillRect(0,0,imageOutline.getWidth(),imageOutline.getHeight());
            g.setColor(Color.BLACK);
            g.setClip(null);
            g.draw(areaOutline);

            g.dispose();
        }
    }

    public Area getOutline(Color target, BufferedImage bi) {
        // construct the GeneralPath
        GeneralPath gp = new GeneralPath();

        boolean cont = false;
        int targetRGB = target.getRGB();
        for (int xx=0; xx

13
задан Community 23 May 2017 в 12:01
поделиться