Matlab выбирает область изображения для изменения

Поэтому я применяю технику обратимого водяного знака, найденную в

«Обратимое нанесение видимых водяных знаков и восстановление исходных изображений без потерь» Ю. Ху и Б. Чон.

Таким образом, часть процесса внедрения включает в себя вставку водяного знака в битовую плоскость (MSB/7thSB) области изображения. Будет известен верхний левый начальный угол региона и размер региона.

Я думаю, что у меня здесь мозг мертвый, но мне было интересно, знает ли кто-нибудь, как выбрать эту область на изображении, чтобы я мог манипулировать ею?

Сейчас у меня region_R = image_I(regionStartPoint + size_W);, но я уверен, что это неправильно. После того, как я получу регион и обработаю его, я также должен поместить его обратно в изображение, я делаю это с помощью чего-то вроде outputImage = union(region_R, surroundingSpace), где surroundingspace - это изображение без региона?

Может быть, я получил не тот конец палки здесь! Может быть, мне просто нужно, чтобы мои циклы for в моем процессе манипулирования начинались с начальной точки? Или используйте imcrop, но я не думаю, что это звучит правильно.

Спасибо!


person bonapart3    schedule 11.12.2014    source источник
comment
Это как-то связано с языком обработки? В противном случае он не должен содержать тег обработки.   -  person Kevin Workman    schedule 11.12.2014
comment
упс! предназначался для написания обработки изображений   -  person bonapart3    schedule 11.12.2014


Ответы (1)


Вы очень близко. Предполагая, что 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
comment
Миллион благодарностей за то, что нашли время все это объяснить! - person bonapart3; 12.12.2014
comment
Я действительно использую bitget для получения битовой плоскости. Что означает ... после запятой при получении region_R? Мое понимание встраивания таково: я буду 1. Изолировать R, 2. Извлекать битовую плоскость из R, называемую D, 3. Сжимать ее, 4. Получать низкую битовую плоскость окружающего пространства, называемую S, 5. Сжимать ее, 6. Добавлять биты от D до S, 7. вставить данные водяного знака в R 8. вставить область обратно в изображение. Чтобы объединить данные водяного знака в 6, должен ли я использовать union()? - person bonapart3; 12.12.2014
comment
... означает переход на следующую строку. Я не хотел, чтобы вся команда помещалась в одну строку, иначе вы будете прокручивать страницу горизонтально :) - person rayryeng; 12.12.2014
comment
Если под конкатенацией вы хотите продолжить объединение предыдущих результатов с текущим изображением, рассмотрите возможность использования logical OR. Это сохранит размер изображения и позволит вам продолжать добавлять результаты. Например, если бы у меня был этот массив: A = logical([0 0 0 1 1 0 0 0 0]); и этот массив B = logical([1 1 0 0 0 0 0 0 1]);, если мы сделали C = A | B;, то получим: C = logical([1 1 0 1 1 0 0 0 1]);. | — это оператор logical OR. Обратите внимание, что это помещает 1 в любую позицию, где либо A, либо B равно 1. - person rayryeng; 12.12.2014
comment
Ах, хорошо, я думаю, все, что мне нужно сделать, это добавить в конец, так что если A = [0 0 0 0 0 0 0 0 0 0 0 0 0] и B = [1 1 1 1 1 1 1 1], то это должен просто дать 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 На самом деле, похоже, что объединение приведет только к [0 1] - person bonapart3; 12.12.2014
comment
Тогда вы бы сделали C = [A B]; - person rayryeng; 12.12.2014
comment
Спасибо! Просто интересно, поэтому, чтобы удалить region_R из изображения, я бы сделал окружениеSpace = image_I - region_R; ? - person bonapart3; 12.12.2014
comment
Нет, не совсем. Мне придется дать вам новый ответ, поэтому я бы порекомендовал вам задать еще один вопрос. - person rayryeng; 12.12.2014
comment
stackoverflow.com/questions/27434426/ - person bonapart3; 12.12.2014