如何使用imagemagick或magick ++从图像中提取多边形

时间:2014-03-26 16:26:11

标签: image-processing imagemagick magick++

我想向我们Magick ++或imagemagick命令行提取 来自图像的n-gon。 n-gon由列表指定 顶点。所以,例如我希望能够提取一个n-gon 由点a,b,c,d,e,f,g,h定义,它们定义了看起来的区域 像:

      a---------h
      |         |
      |         g-f
      |           |
      b---c       |
          |       |
          |       |
          |       |
          d-------e
例如,png图像中的

。我想我必须做某种事 使用图像蒙板进行复合操作,或者使用Magick ++定义a DrawableClipPath。但是,我找不到任何相关的文档。任何 帮助将不胜感激。

P.S。我的偏好是使用C ++和Magick ++来做这件事,因为我有其他的 处理要做,但很高兴用命令行做。

1 个答案:

答案 0 :(得分:3)

您可以使用Magick::DrawablePolygonMagick::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
}

n-gon