Magick ++模糊面具

时间:2016-01-07 09:17:14

标签: c++ image-processing imagemagick blur magick++

我正在尝试将模糊蒙版的ImageMagick命令转换为Magick ++ API。

ImageMagick的

convert -size 720x478 xc: -sparse-color Barycentric '0,0 black 0,%h white' -function polynomial 4,-4,1 -level 0,50% mask.jpg

Magick ++

Magick::Image mask(Magick::Geometry(720,478), Magick::Color("white"));

double args[6];
args[0] = 0;
args[1] = 0;
args[2] = 0;
args[3] = 0;
args[4] = mask.rows();
args[5] = MaxRGB;

mask.sparseColor(Magick::DefaultChannels, Magick::BarycentricColorInterpolate, 6, args);

args[0] = 4;
args[1] = -4;
args[2] = 1;
args[3] = 0;
args[4] = 0;
args[5] = 0;

mask.quantumOperator(Magick::DefaultChannels, Magick::PolynomialFunction,
    3,args);

parseLevel(image, "0,50%", args); // contains code from mogrify.c for parsing the leveling string

mask.level(args[0], args[1], args[2], ' ');

我得到的结果只是一张白色图像,而正确的蒙版图像应该是这样的:

enter image description here

有人可以告诉我我的错误吗?

2 个答案:

答案 0 :(得分:1)

嗯,我没有使用imagemagick的经验,但很快就会查看文档,在你的例子中,我有一个预感:也许默认的图像类型是rgb,你需要为稀疏的每种颜色设置三个float / double参数 - 彩色电话。像那样:

Magick::Image mask(Magick::Geometry(720,478), Magick::Color("white"));

double args[10];

// -sparse-color Barycentric '0,0 black 0,%h white' 

args[0] = 0;           // x = 0
args[1] = 0;           // y = 0
args[2] = 0;           // black (R)
args[3] = 0;           // black (G)
args[4] = 0;           // black (B)
args[5] = 0;           // x = 0
args[6] = mask.rows(); // y = %h
args[7] = MaxRGB;      // white (R)
args[8] = MaxRGB;      // white (G)
args[9] = MaxRGB;      // white (B)

mask.sparseColor(Magick::DefaultChannels, Magick::BarycentricColorInterpolate, 10, args);

答案 1 :(得分:0)

事实证明我在ChannelType函数中给出了错误的sparseColor()DefaultChannels枚举包含RGBChannels OpacityChannelIndexChannel。我必须通过按位操作从DefaultChannels枚举中排除后两个。正如@ThorngardSO指出的那样,args大小也需要为10。

<强>码

double args[10];

// -sparse-color Barycentric '0,0 black 0,%h white' 

args[0] = 0;           // x = 0
args[1] = 0;           // y = 0
args[2] = 0;           // black (R)
args[3] = 0;           // black (G)
args[4] = 0;           // black (B)
args[5] = 0;           // x = 0
args[6] = mask.rows(); // y = %h
args[7] = MaxRGB;      // white (R)
args[8] = MaxRGB;      // white (G)
args[9] = MaxRGB;      // white (B)

mask.sparseColor((Magick::DefaultChannels & ~OpacityChannel) & ~IndexChannel, Magick::BarycentricColorInterpolate, 10, args);