Разделите изображение на непересекающиеся блоки и примените 2D DWT к каждому блоку - PullRequest
1 голос
/ 24 марта 2019

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

Я попробовал blockprocфункция, чтобы сделать это, но я не получил результата:

I = imread('pears.png');

fun = @(block_struct)...
    dwt2(block_struct.data,'dmey');

C = blockproc(I,[64 64],fun);

Так как я могу получить доступ к [cA,cH,cV,cD] из dwt2, используя приведенный выше код?

1 Ответ

1 голос
/ 24 марта 2019

blockproc предполагает, что вы выводите фактическое изображение. Вы не можете использовать это для нескольких выходов. Если вы действительно хотите, чтобы это работало с blockproc, вам, к сожалению, придется вызывать blockproc четыре раза, каждый раз извлекая различный набор коэффициентов для направлений. Также обратите внимание, что 2D DWT работает только для изображений в градациях серого , поэтому вам необходимо преобразовать в оттенки серого, прежде чем выполнять какую-либо обработку. Выбранное вами изображение груши - это цветное / RGB-изображение.

Я хотел бы сослаться на этот пост о том, как выбрать N-й выход, учитывая функцию ввода: Как получить второе возвращаемое значение из функции без использования временных переменных? . Вам нужно сохранить этот код в файл с именем nth_output.m, который позволяет программно извлекать все выходные переменные из функции и выбирать только один выход.

function value = nth_output(N,fcn,varargin)
  [value{1:N}] = fcn(varargin{:});
  value = value{N};
end

Простое исключение дополнительных выходных аргументов при вызове функции дает вам только первый выход, что и делает ваш код blockproc. После того, как вы это сделаете, вам нужно создать 4 анонимные функции для захвата каждого вывода из dwt2 и запустить blockproc 4 раза. Убедитесь, что вы указали, какой вывод вы хотите использовать для каждой из анонимных функций, поэтому от 1 до 4 и вы просто предоставляете дескриптор функции, которую хотите запустить, в дополнение к входным аргументам, которые входят в функцию.

Поэтому попробуйте что-то вроде этого:

I = rgb2gray(imread('pears.png'));
fun1 = @(block_struct) nth_output(1, @dwt2, block_struct.data,'dmey');
fun2 = @(block_struct) nth_output(2, @dwt2, block_struct.data,'dmey');
fun3 = @(block_struct) nth_output(3, @dwt2, block_struct.data,'dmey');
fun4 = @(block_struct) nth_output(4, @dwt2, block_struct.data,'dmey');
I = rgb2gray(I);
cA = blockproc(I,[64 64],fun1);
cH = blockproc(I,[64 64],fun2);
cV = blockproc(I,[64 64],fun3);
cD = blockproc(I,[64 64],fun4);

cA, cH, cV и cD содержат коэффициенты DWT, необходимые для каждого набора направлений.

...