1

I'm working on the classifying object in the image.

I'm using Marvin Image Processing Framework, and I'm successfully segmenting object, but I want to insert text on the image

enter image description here

This is the output of my image segmentation, and I want to draw text above the object by condition.

For example, I write function that calculate average diagonal of each rectangle, and I insert "bolt" if rectangle's diagonal is larger than average.

However, I couldn't find any method to insert text with using Marvin Image Processing Framework.

This is part of my code:

public Recognition() {
    MarvinImage input = MarvinImageIO.loadImage("Parts1.jpg");
    MarvinImage copy = input.clone();


    filterBlue(copy);
    MarvinImage bin = MarvinColorModelConverter.rgbToBinary(copy, 127);
    morphologicalClosing(bin.clone(), bin, MarvinMath.getTrueMatrix(30, 30));
    copy = MarvinColorModelConverter.binaryToRgb(bin);
    MarvinSegment[] marvSeg = floodfillSegmentation(copy);
    calculateAvg(marvSeg);
    for(int i = 1; i < marvSeg.length; i++)
    {
        MarvinSegment segment = marvSeg[i];
        input.drawRect(segment.x1, segment.y1, segment.width, segment.height, Color.ORANGE);
        input.drawRect(segment.x1+1, segment.y1+1, segment.width, segment.height, Color.ORANGE);
        if (calcDiag(segment.width, segment.height) > recDiagonalAverage)
        {
            //draw string "bolt" if current diagonal is larger than average
        }
    }

    MarvinImageIO.saveImage(input, "output.jpg");
}

If I don't have any method to insert with Marvin Image Processing Framework, How can I insert text with these code?

Gabriel Archanjo
  • 4,547
  • 2
  • 34
  • 41
Konorika
  • 69
  • 2
  • 9

1 Answers1

1

Every time you need a rendering feature not provided by Marvin, but provided by Java Graphics, you can do the following:

  1. Get a BufferedImage representation from a MarvinImage object using image.getBufferedImageNoAlpha();
  2. Get the Graphics2D from the BufferedImage object.
  3. Use Graphics2D rendering algorithms
  4. Set the BufferedImage back to the MarvinImage using image.setBufferedImage(bufImage);

The example below uses a hypothetical MarvinSegment object created using the coordinates of your output.jpg image. You just need to add the drawStringMarvin(...) to your code.

Parts1_output_2.jpg:

enter image description here

Source code:

public class DrawStringExample {

    private static Font FONT = new Font("Verdana", Font.BOLD, 28);

    public DrawStringExample() {
        MarvinImage image = MarvinImageIO.loadImage("./res/Parts1_output.jpg");
        MarvinSegment segment = new MarvinSegment(537, 26, 667, 96);
        drawStringMarvin("bolt", segment, image);
        MarvinImageIO.saveImage(image, "./res/Parts1_output_2.jpg");
    }

    private void drawStringMarvin(String text, MarvinSegment segment, MarvinImage image) {
        BufferedImage bufImage = image.getBufferedImageNoAlpha();
        Graphics2D g2d = (Graphics2D)bufImage.getGraphics();
        g2d.setFont(FONT);
        g2d.drawString(text, segment.x1, segment.y1+FONT.getSize());
        image.setBufferedImage(bufImage);   
    }

    public static void main(String[] args) {
        new DrawStringExample();
    }
}
Gabriel Archanjo
  • 4,547
  • 2
  • 34
  • 41