你很亲密。假设regionStartPoint存储了你想要开始的左上角的row和column,它是一个二元素数组,并假设size_W包含你想要的区域的height和width,也可以作为一个二元数组,只需这样做:
region_R = image_I(regionStartPoint(1):regionStartPoint(1)+size_W(1)-1,...
regionStartPoint(2):regionStartPoint(2)+size_W(2)-1,:);
在上面的代码中,我们想要访问从左上角开始的一系列行元素 (regionStartPoint(1)),并且我们想要访问 size_W(1) = height 元素,您最多可以访问regionStartPoint(1)+size_W(1)-1。您减去 1 的原因是因为当我们索引到特定维度时,我们正在访问范围内(包括)内的每个元素。例如,如果我们的起始行位置是 1,而我们的高度是 2,那么我们将只访问第 1 行和第 2 行。如果我们从 1 开始并向上增加 height=2 元素,我们实际上会获取一个额外的元素,所以我们会得到第 1 行、第 2 行 和 3。我们不想要最后一行,所以减 1 有助于我们做到这一点。以类似的方式,如果我们希望访问一系列列元素,它也从左上角 (regionStartPoint(2)) 开始,并且我们希望访问 size_W(2) = width 元素,您最多可以访问 @ 987654332@ 元素。
因此,我们访问矩阵时,第一个参数指定所需的行范围,第二个参数指定所需的列范围。因为您的图像可能是彩色或灰度的,所以我使用: 作为最后一个参数,以便您可以获得所有的 3D 切片。如果您的图像是灰度的,那么这不会做任何事情,但是如果它是彩色的,它将为您提供一个 3D 矩阵,其中每个切片的大小都是您要提取的区域的大小,并且切片的数量与颜色的数量一样多飞机。
完成对图像的操作后,您可以通过以下方式将其放回image_I:
image_I(regionStartPoint(1):regionStartPoint(1)+size_W(1)-1,...
regionStartPoint(2):regionStartPoint(2)+size_W(2)-1,:) = region_R_final;
region_R_final 将是您从image_I 中提取后处理的图像。这与您之前想要提取图像的一部分时看到的语法完全相同相同,但现在角色颠倒了。我们希望将这部分放回到图像中,因此您只需要交换赋值运算符 (=) 左侧和右侧的内容即可。
或者,如果您无法计算出抵消和提取图像中内容的数学方法,您可以使用图像处理工具箱中的imcrop。具体来说,你会这样做:
region_r = imcrop(image_I, [regionStartPoint(2) regionStartPoint(1) size_W(2) size_W(1)]);
第一个输入是您要裁剪的图像,而第二个元素是一个由 4 个元素组成的数组,格式如下:
[x y w h]
x 和 y 是您要提取的左上角的 column 和 row 位置,而 w 和 @987654345 @ 是您要提取的部分的宽度和高度。如果你把它翻转了,regionStartPoint 有 column 首先是 row 和 sizeW 有它这样 width 来首先是高度,这段代码将简化为:
region_r = imcrop(image_I, [regionStartPoint size_W]);
在运行imcrop 之前,请确保[x y w h] 数组的顺序正确。
小提示
我不确定您是如何提取图像中每个像素的 MSB,但请考虑使用 bitget。这需要一个矩阵或向量,然后您指定要获取的位位置。这将返回一个 0s/1s 数组,其大小与您提供的输入相同,并且每个位置将为您提供矩阵中每个数字的相应位。在你的情况下,你会这样做:
bitMSB = bitget(A, 8);
A 是您要分析的图像,8 是您要获得的第 8 个位置/位。我们实际上是从 1 开始计数,而不是 MATLAB 中的 0(即 1 索引)。
祝你好运!