блок обработки с несколькими входными матрицами - PullRequest
5 голосов
/ 02 марта 2011

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

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

6 голосов
/ 02 марта 2011

blockproc позволяет вам повторять только для одного изображения, но не мешает вам работать с любыми данными, которые вы хотите.Сигнатура пользовательской функции принимает в качестве входных данных «блочную структуру», которая содержит не только поле данных (которое используется во всех примерах blockproc), но также и несколько других полей, одним из которых является «location».Вы можете использовать это, чтобы определить «где вы находитесь» во входном изображении и определить, какие другие данные вам нужны для работы с этим блоком. Например,

, вот как вы можете сделать поэлементное умножение на 2 одинаковыхизображения.Это довольно неуклюжий пример, но просто здесь, чтобы продемонстрировать, как это могло бы выглядеть:

im1 = rand(100);
im2 = rand(100);
fun = @(bs) bs.data .* ...        
    im2(bs.location(1):bs.location(1)+9,bs.location(2):bs.location(2)+9);
im3 = blockproc(im1,[10 10],fun);
im4 = im1 .* im2;
isequal(im3,im4)

Используя поле «location» структуры блока, вы можете найти соответствующие части 2-го, 3-го, 4-го,и т. д. набор данных, необходимый для этого конкретного блока.

надеюсь, это поможет!

-brendan

3 голосов
/ 08 ноября 2012

Недавно я боролся с одной и той же вещью и решил ее, объединив обе свои входные матрицы в одну трехмерную матрицу следующим образом. Закомментированные строки были моим исходным кодом до того, как в него была введена обработка блоков. Другая проблема, с которой я столкнулся, заключалась в использовании в функции переменных, отличных от матрицы изображений: сначала мне нужно было выполнить эту часть вычисления. Если кто-то может упростить это, пожалуйста, дайте мне знать!

%%LAB1 - L*a*b nearest neighbour classification
%distance_FG = ((A-FG_A).^2 + (B-FG_B).^2).^0.5;
%distance_BG = ((A-BG_A).^2 + (B-BG_B).^2).^0.5;

distAB = @(bs) ((bs.data(:,:,1)).^2 + (bs.data(:,:,2)).^2).^0.5;
AB = A - FG_A; AB(:,:,2) = B - FG_B;
distance_FG = blockproc(AB, [1000, 1000], distAB);
clear AB
AB = A - BG_A; AB(:,:,2) = B - BG_B;
distance_BG = blockproc(AB, [1000, 1000], distAB);
clear AB
2 голосов
/ 02 марта 2011

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

например, A(:,:,1) = I1; A(:,:,2) = I2;

Теперь вы можете использовать blockproc для A.

...