Морфология из Magick++ для соответствия командной строке Convert

Я пытаюсь продублировать командную строку ImageMagick:

Convert In.jpg ( -bias 50% -morphology Convolve LoG:0x1.5 ) Out.jpg

через Magick++ на C++ (visual Studio 2010 Express)

Я читал, что морфологические операции не являются частью Magic++, поэтому необходимо использовать функции C MagickCore. Я не могу получить вывод, который соответствует (или даже близок) выводу командной строки ImageMagick.

Я пытаюсь создать ядро ​​через

k=MagickCore::AcquireKernelInfo("LoG:0x1.5");

и выполнить морфологию через

m = MagickCore::MorphologyImage(i, MagickCore::ConvolveMorphology, 3, k, e);

Я догадываюсь об этих методах и параметрах из-за отсутствия информации о специфике. Есть ли у кого-нибудь руководство о том, как добиться того же результата на С++?


person UtilizeIT    schedule 10.02.2014    source источник
comment
Значение по умолчанию для количества итераций равно 1. Вы должны использовать 1 вместо 3.   -  person dlemstra    schedule 11.02.2014
comment
Спасибо что подметил это. Этот параметр не был очевиден из всплывающего окна IntelliSense, в котором просто указано «ssize_t», или из вопроса stackoverflow: stackoverflow.com/questions/8980165/morphology-using-magick Этот пост - единственная информация, которую я смог найти о морфологических операциях из Magick++. Я видел функцию в исходной библиотеке ImageMagick, которая указывает аргумент «interation», но это была функция MagickMorphologyImage (MagickWand *wand, метод MorphologyMethod, const ssize_t iterations, KernelInfo *kernel), подпись была близка, но...   -  person UtilizeIT    schedule 11.02.2014


Ответы (2)


Чтобы выполнить эти операции в Magick++, потребовалось бы много утомительных шагов, документации по которым у меня нет. Создание ядра особенно сомнительно, так как оно получилось 13x13.

Я нашел другой способ достичь той же цели: использовать MagickCore::ConvertImageComand(). Параметры такие же, как и в версии командной строки, и выходные данные такие же. Использование команды из С++ работает без проблем...

с использованием пространства имен Magick;
char *args[]={"convert", "In.jpg","(","-bias","50%","-morphology", "convolve", "LoG: 0x1.5", ")","Out.jpg" }; интервал_число_аргументов = 10;

MagickCore::ExceptionInfo *exception = MagickCore::AcquireExceptionInfo();
MagickCore::ImageInfo *image_info = MagickCore::AcquireImageInfo();
(void) strcpy(image_info->filename,"In.jpg");
image = MagickCore::ReadImage(image_info, exception);
  MagickBooleanType status =
   ConvertImageCommand(image_info, args_count, args, NULL, exception);

Я бы предпочел, чтобы эта операция приводила к буферу или изображению в памяти, а не к записи на диск, но я думаю, что это другой вопрос...

person UtilizeIT    schedule 11.02.2014

В следующей версии ImageMagick (6.8.8-7) будет поддержка морфологии в Magick++ API. Ваша команда:

convert In.jpg -bias 50% -morphology Convolve LoG:0x1.5 Out.jpg

можно записать так:

Magick::Image img;

img.read("In.jpg");
img.artifact("convolve:bias", "50%");
img.morphology(ConvolveMorphology, LoGKernel, "0x1.5");
img.write("Out.jpg");
person dlemstra    schedule 16.02.2014