如何用新的替换块矩阵?
How to replace a block matrix with a new one?
我有一张128*128的图片,我分成了32*32个不重叠的块,问题是我想更改特定块或选择块的值(第一个或第三个..示例)并获取具有新值的块,然后在我的图像中替换它。你知道如何获得修改了一个块(不是所有块)的图像吗?
谢谢
这是一个小矩阵的例子
%*********************
A=magic(6) ; %%%%% matrix size 6*6
B=Block(A,2,2) ; % divide the matrix into 2*2 non-overlapping blocks
subblock=B{3} ; % Choose the 3rd block
new_block= 2*subblock; % change the block values by multipliying by 2
这就是我得到的
A = 35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
我提取第3块
sub_block=19 24
23 25
现在我乘以 2 :
new_block= 38 48
46 50
这是我的块功能:
function A=Block(IM,p,q)
p=3;
q=3;
[m,n] = size(IM);
IJ = zeros(p,q);
z = 1;
for m1 = 1:m/p
for n1 = 1:n/q
if m1*p <= m;
if n1*q <= n;
for i = (m1-1)*p+1:m1*p
for j = (n1-1)*q+1:n1*q
IJ(i-(m1-1)*p,j-(n1-1)*q) = IM(i,j);
if (i-(m1-1)*p)==p&&(j-(n1-1)*q)==q;
OUT = IJ;
A{1,z} = OUT;
z = z+1;
end
end
end
end
end
end
结束
我想替换矩阵 A 中的这些值,但取决于块号。我该怎么做?
例如,只需输入您要访问的行和列
A(1:2,5:6)=A(1:2,5:6)*2
更通用,其中 n 是第 n 个 列块 ,m 是第 m 个 行块,c 是块宽度,r是区块高度(在你的例子中,n = 3, m = 1, r=c=2)
A(((m-1)*r+1):(m*r), ((n-1)*c+1):(n*c)) = any block of size(r,c)
我不知道你的 Block
函数,你实际上不需要转换为单元格矩阵,但如果你确实想要,那么我会这样做:
A = magic(6);
[m,n] = size(A);
r=2; %// Desired number rows of blocks, m must be a multiple of r
c=2; %// Desired number cols of blocks, n must be a multiple of c
%// Create blocks (but as a 2D grid rather than a list)
B = mat2cell(A,r*ones(m/r,1), c*ones(n/c,1))
%// Manipulate a block
B(1,3) = {2*B{1,3}};
%// Convert back to a matrix
cell2mat(B)
我认为 是更好的方法,如果这就是您想要做的全部
我有一张128*128的图片,我分成了32*32个不重叠的块,问题是我想更改特定块或选择块的值(第一个或第三个..示例)并获取具有新值的块,然后在我的图像中替换它。你知道如何获得修改了一个块(不是所有块)的图像吗? 谢谢 这是一个小矩阵的例子
%*********************
A=magic(6) ; %%%%% matrix size 6*6
B=Block(A,2,2) ; % divide the matrix into 2*2 non-overlapping blocks
subblock=B{3} ; % Choose the 3rd block
new_block= 2*subblock; % change the block values by multipliying by 2
这就是我得到的
A = 35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
我提取第3块
sub_block=19 24
23 25
现在我乘以 2 :
new_block= 38 48
46 50
这是我的块功能:
function A=Block(IM,p,q)
p=3;
q=3;
[m,n] = size(IM);
IJ = zeros(p,q);
z = 1;
for m1 = 1:m/p
for n1 = 1:n/q
if m1*p <= m;
if n1*q <= n;
for i = (m1-1)*p+1:m1*p
for j = (n1-1)*q+1:n1*q
IJ(i-(m1-1)*p,j-(n1-1)*q) = IM(i,j);
if (i-(m1-1)*p)==p&&(j-(n1-1)*q)==q;
OUT = IJ;
A{1,z} = OUT;
z = z+1;
end
end
end
end
end
end
结束 我想替换矩阵 A 中的这些值,但取决于块号。我该怎么做?
例如,只需输入您要访问的行和列
A(1:2,5:6)=A(1:2,5:6)*2
更通用,其中 n 是第 n 个 列块 ,m 是第 m 个 行块,c 是块宽度,r是区块高度(在你的例子中,n = 3, m = 1, r=c=2)
A(((m-1)*r+1):(m*r), ((n-1)*c+1):(n*c)) = any block of size(r,c)
我不知道你的 Block
函数,你实际上不需要转换为单元格矩阵,但如果你确实想要,那么我会这样做:
A = magic(6);
[m,n] = size(A);
r=2; %// Desired number rows of blocks, m must be a multiple of r
c=2; %// Desired number cols of blocks, n must be a multiple of c
%// Create blocks (but as a 2D grid rather than a list)
B = mat2cell(A,r*ones(m/r,1), c*ones(n/c,1))
%// Manipulate a block
B(1,3) = {2*B{1,3}};
%// Convert back to a matrix
cell2mat(B)
我认为