Вы очень близко. Предполагая, что regionStartPoint
хранит строку и столбец верхнего левого угла, где вы хотите начать, и это массив из двух элементов, и предположив, что size_W
содержит >высота и ширина нужного вам региона, а также в виде двухэлементного массива, просто выполните:
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
элементами, вы получаете доступ к regionStartPoint(2)+size_W(2)-1
элементам.
Таким образом, мы обращаемся к матрицам таким образом, что первый параметр указывает диапазон строк, которые вы хотите, а второй параметр указывает диапазон нужных столбцов. Поскольку ваше изображение может быть цветным или в градациях серого, я использовал :
в качестве последнего параметра, чтобы вы могли получить все 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
– это расположение столбца и строки в верхнем левом углу места, откуда вы хотите извлечь данные, а w
и h
– это ширина и высота нужной части. извлекать. Если вы перевернули его так, что regionStartPoint
имеет столбец, за которым следует строка, а sizeW
имеет так, что ширина идет первой, а затем height, этот код можно упростить до:
region_r = imcrop(image_I, [regionStartPoint size_W]);
Просто убедитесь, что массив [x y w h]
находится в правильном порядке перед запуском imcrop
.
Незначительное примечание
Я не знаю, как вы извлекаете MSB каждого пикселя изображения, но рассмотрите возможность использования bitget
. Это принимает матрицу или вектор, и вы указываете, какую битовую позицию вы хотите получить. Это вернет массив 0s/1s, который имеет тот же размер, что и введенный вами ввод, и каждая позиция даст вам, какой соответствующий бит был для каждого числа в вашей матрице. В вашем случае вы бы сделали:
bitMSB = bitget(A, 8);
A
будет изображением, которое вы хотите проанализировать, а 8
— это 8-я позиция/бит, которую вы хотите получить. На самом деле мы начинаем считать с 1 вместо 0 в MATLAB (т. е. 1-индексация).
Удачи!
person
rayryeng
schedule
11.12.2014