私はステガノグラフィー用の画像を処理するmatlabに取り組んでいます。これまでの私の作業では、ブロック処理コマンド blockproc を使用して、画像をブロックに分割して作業してきました。私は今、シークレットとカバーの 2 つの画像で作業を開始しようとしていますが、1 つではなく 2 つの入力行列で blockproc を使用する方法が見つかりません。
これを行う方法を知っている人はいますか?
私はステガノグラフィー用の画像を処理するmatlabに取り組んでいます。これまでの私の作業では、ブロック処理コマンド blockproc を使用して、画像をブロックに分割して作業してきました。私は今、シークレットとカバーの 2 つの画像で作業を開始しようとしていますが、1 つではなく 2 つの入力行列で blockproc を使用する方法が見つかりません。
これを行う方法を知っている人はいますか?
blockproc を使用すると、単一の画像のみを反復処理できますが、必要なデータの操作を停止することはありません。ユーザー関数のシグネチャは、データ フィールド (すべての blockproc の例で使用される) だけでなく、いくつかの他のフィールドを含む "ブロック構造体" を入力として取ります。そのうちの 1 つは "場所" です。これを使用して、入力画像の「現在位置」を特定し、そのブロックで操作する必要がある他のデータを特定できます。
たとえば、同じサイズの 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)
ブロック構造体の「位置」フィールドを使用すると、その特定のブロックに必要な 2 番目、3 番目、4 番目などのデータ セットの適切な部分を把握できます。
お役に立てれば!
-ブレンダン
私は最近同じことで苦労していましたが、次のように両方の入力行列を1つの3D行列に結合することで解決しました。コメントアウトされた行は、ブロック処理を導入する前の私の元のコードでした。私が抱えていたもう1つの問題は、関数で画像行列以外の変数を使用することでした。最初に計算のその部分を実行する必要がありました。誰かがそれを単純化できるなら、私に知らせてください!
%%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