5

我正在使用 matlab 处理用于隐写术的图像。到目前为止,在我的工作中,我一直在使用块处理命令 blockproc 将图像分解成块来处理它。我现在希望开始使用两个图像,即秘密和封面,但无论如何我都找不到将 blockproc 与两个输入矩阵而不是一个输入矩阵一起使用。

有人知道这样做的方法吗?

4

3 回答 3

6

blockproc 允许您仅迭代单个图像,但不会阻止您对任何您想要的数据进行操作。用户函数的签名将“块结构”作为输入,其中不仅包含数据字段(在所有块过程示例中使用),还包含其他几个字段,其中之一是“位置”。您可以使用它来确定输入图像中的“您在哪里”,并确定您需要对该块进行操作的其他数据。

例如,以下是如何在 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)

使用块结构的“位置”字段,您可以找出该特定块所需的第二、第三、第四等数据集的适当部分。

希望这可以帮助!

-布伦丹

于 2011-03-02T14:24:22.877 回答
3

我最近在同样的事情上苦苦挣扎,并通过将我的两个输入矩阵组合成一个 3D 矩阵来解决它,如下所示。在引入块处理之前,注释掉的行是我的原始代码。我遇到的另一个问题是在函数中使用除图像矩阵以外的变量:我必须先进行这部分计算。如果有人可以简化它,请告诉我!

%%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
于 2012-11-08T00:31:33.860 回答
2

我认为您的问题的解决方案在于创建一个包含两个输入矩阵的新矩阵。

例如A(:,:,1) = I1; A(:,:,2) = I2;

现在您可以blockproc在 A 上使用。

于 2011-03-02T11:14:30.877 回答