Как извлечь многоугольник из изображения, используя imagemagick или magick++

Я хотел бы использовать Magick++ или командную строку imagemagick для извлечения n-gon из изображения. N-гон определяется списком вершин. Так, например, я хотел бы быть в состоянии извлечь n-гон, определенный точками a, b, c, d, e, f, g, h, которые определяют область, которая похожа на:

      a---------h
      |         |
      |         g-f
      |           |
      b---c       |
          |       |
          |       |
          |       |
          d-------e

например, из PNG-изображения. Я предполагаю, что мне нужно выполнить какую-то сложную операцию с маской изображения или, если с помощью Magick++ определить DrawableClipPath. Но я не могу найти никакой документации для этого. Любая помощь будет оценена.

ps Я предпочитаю делать это с использованием C++ и Magick++, потому что у меня есть другая обработка, но я тоже рад сделать это с помощью командной строки.

1 ответ

Решение

Вы бы использовали комбинацию Magick::DrawablePolygon а также Magick::Image.composite,

Создайте новое изображение маски и нарисуйте фигуру n-gon

Magick::Image mask;
mask.draw( Magick::DrawablePolygon( std::list<Magick::Coordinate> ) );

Затем просто примените маску к целевому изображению и составьте существующий источник.

Magick::Image dest;
dest.composite( Magick::Image, Magick::Geometry, Magick::CompositeOperator );

Пример:

#include <iostream>
#include <Magick++.h>

int main(int argc, const char ** argv)
{
    Magick::InitializeMagick(*argv);

    Magick::Image mask( Magick::Geometry(120,120), Magick::Color("white"));
    Magick::Image dest( Magick::Geometry(120,120), Magick::Color("white"));

    // Example source image
    Magick::Image source;
    source.read("rose:");
    source.resize(Magick::Geometry(200,120)); // Resize for fun

    mask.fillColor("black");

    // Define points
    std::list<Magick::Coordinate> points;
    points.push_back(Magick::Coordinate(10, 10)); // a
    points.push_back(Magick::Coordinate(10, 50)); // b
    points.push_back(Magick::Coordinate(30, 50)); // c
    points.push_back(Magick::Coordinate(30,100)); // d
    points.push_back(Magick::Coordinate(75,100)); // e
    points.push_back(Magick::Coordinate(75, 30)); // f
    points.push_back(Magick::Coordinate(60, 30)); // g
    points.push_back(Magick::Coordinate(60, 10)); // h

    // Draw Polygon "n-gon"
    mask.draw( Magick::DrawablePolygon(points) );

    // Extract n-gon from source image to destination image
    dest.clipMask(mask);
    Magick::Geometry offset(0,0,0,0);
    dest.composite( source, offset, Magick::OverCompositeOp );

    dest.write("n-gon.png"); // Output
}

п-угольник

Другие вопросы по тегам