无需循环 MATLAB 即可获取图像的帧/图案
Get frame / pattern of an image without loop MATLAB
我想提取图像的特定部分。比方说,只有那些在某种模板或框架中被索引的部分。
GRAYPIC = reshape(randperm(169), 13, 13);
FRAME = ones(13);
FRAME(5:9, 5:9) = 0;
FRAME_OF_GRAYPIC = []; % the new pic that only shows the frame extracted
我可以使用 for 循环来实现:
for X = 1:13
for Y = 1:13
vlaue = FRAME(Y, X);
switch vlaue
case 1
FRAME_OF_GRAYPIC(X,Y) = GRAYPIC(X,Y)
case 0
FRAME_OF_GRAYPIC(X,Y) = 0
end
end
end
imshow(mat2gray(FRAME_OF_GRAYPIC));
但是,是否可以将它与某种向量运算一起使用,即:
FRAME_OF_GRAYPIC = GRAYPIC(FRAME==1);
不过,不幸的是,这不起作用。
有什么建议吗?
非常感谢您的回答,
最好,
克莱门斯
评论太长...
GRAYPIC = reshape(randperm(169), 13, 13);
FRAME = zeros(13);
FRAME(5:9, 5:9) = 0;
FRAME_OF_GRAYPIC = zeros(size(GRAYPIC); % MUST preallocate new pic the right size
FRAME = logical(FRAME); % ... FRAME = (FRAME == 1)
FRAME_OF_GRAYPIC(FRAME) = GRAYPIC(FRAME);
这里要注意三点:
- FRAME 必须是逻辑数组。使用
true()
/false()
创建它,或使用 logical()
转换它,或 select 使用 FRAME = (FRAME == true_value);
为真值
- 您必须将最终图像预先分配到适当的尺寸,否则它会变成矢量。
- 您需要作业两 面的图像索引:
FRAME_OF_GRAYPIC(FRAME) = GRAYPIC(FRAME);
输出:
FRAME_OF_GRAYPIC =
38 64 107 63 27 132 148 160 88 59 102 69 81
14 108 76 58 49 55 51 19 158 52 100 153 39
79 139 12 115 147 154 96 112 82 73 159 146 93
169 2 71 25 33 149 138 150 129 117 65 97 17
43 111 37 142 0 0 0 0 0 128 84 86 22
9 137 127 45 0 0 0 0 0 68 28 46 163
42 11 31 29 0 0 0 0 0 152 3 85 36
50 110 165 18 0 0 0 0 0 144 143 44 109
114 133 1 122 0 0 0 0 0 80 167 157 145
24 116 60 130 53 77 156 35 6 78 90 30 140
74 120 40 26 106 166 121 34 98 57 56 13 48
8 155 4 16 124 75 123 23 105 66 7 141 70
89 113 99 101 54 20 94 72 83 168 61 5 10
我想提取图像的特定部分。比方说,只有那些在某种模板或框架中被索引的部分。
GRAYPIC = reshape(randperm(169), 13, 13);
FRAME = ones(13);
FRAME(5:9, 5:9) = 0;
FRAME_OF_GRAYPIC = []; % the new pic that only shows the frame extracted
我可以使用 for 循环来实现:
for X = 1:13
for Y = 1:13
vlaue = FRAME(Y, X);
switch vlaue
case 1
FRAME_OF_GRAYPIC(X,Y) = GRAYPIC(X,Y)
case 0
FRAME_OF_GRAYPIC(X,Y) = 0
end
end
end
imshow(mat2gray(FRAME_OF_GRAYPIC));
但是,是否可以将它与某种向量运算一起使用,即:
FRAME_OF_GRAYPIC = GRAYPIC(FRAME==1);
不过,不幸的是,这不起作用。
有什么建议吗?
非常感谢您的回答, 最好, 克莱门斯
评论太长...
GRAYPIC = reshape(randperm(169), 13, 13);
FRAME = zeros(13);
FRAME(5:9, 5:9) = 0;
FRAME_OF_GRAYPIC = zeros(size(GRAYPIC); % MUST preallocate new pic the right size
FRAME = logical(FRAME); % ... FRAME = (FRAME == 1)
FRAME_OF_GRAYPIC(FRAME) = GRAYPIC(FRAME);
这里要注意三点:
- FRAME 必须是逻辑数组。使用
true()
/false()
创建它,或使用logical()
转换它,或 select 使用FRAME = (FRAME == true_value);
为真值
- 您必须将最终图像预先分配到适当的尺寸,否则它会变成矢量。
- 您需要作业两 面的图像索引:
FRAME_OF_GRAYPIC(FRAME) = GRAYPIC(FRAME);
输出:
FRAME_OF_GRAYPIC =
38 64 107 63 27 132 148 160 88 59 102 69 81
14 108 76 58 49 55 51 19 158 52 100 153 39
79 139 12 115 147 154 96 112 82 73 159 146 93
169 2 71 25 33 149 138 150 129 117 65 97 17
43 111 37 142 0 0 0 0 0 128 84 86 22
9 137 127 45 0 0 0 0 0 68 28 46 163
42 11 31 29 0 0 0 0 0 152 3 85 36
50 110 165 18 0 0 0 0 0 144 143 44 109
114 133 1 122 0 0 0 0 0 80 167 157 145
24 116 60 130 53 77 156 35 6 78 90 30 140
74 120 40 26 106 166 121 34 98 57 56 13 48
8 155 4 16 124 75 123 23 105 66 7 141 70
89 113 99 101 54 20 94 72 83 168 61 5 10