2010-05-15 2 views
3

Я хотел бы знать, как маскировать часть изображения, которое находится в BLACK & WHITE?Как скрыть часть изображения в Matlab?

У меня есть объект, который должен быть обнаружен краем, но у меня есть другие белые мешающие объекты в фоновом режиме, которые ниже целевого объекта ... Я хотел бы замаскировать всю нижнюю часть изображения на черный, как Я могу это сделать ?

Спасибо!

EDIT

Я также хочу, чтобы скрыть некоторые другие части (верхняя часть) ... Как я могу это сделать?

Пожалуйста, объясните код, потому что я действительно хочу узнать, как это работает и реализовать его в моем собственном понимании.

EDIT2

Мой образ 480x640 ... Есть ли способ, чтобы замаскировать определенные пиксели? например 180x440 с изображением ...

+0

Когда вы говорите, «нижняя часть», вы имеете в виду нижнюю часть пространственно, или по интенсивности? – mmr

+0

Я имею в виду пространственно ... – NLed

ответ

5

Если у вас есть 2-D grayscale intensity image хранится в матрице A, вы можете установить нижнюю половину черный, выполнив следующие действия:

centerIndex = round(size(A,1)/2);   %# Get the center index for the rows 
A(centerIndex:end,:) = cast(0,class(A)); %# Set the lower half to the value 
              %# 0 (of the same type as A) 

Это работает первым получить номер строк в A с использованием функции SIZE, разделив ее на 2 и округляя ее, чтобы получить индекс целого рядом с центром высоты изображения. Затем вектор centerIndex:end индексирует все строки от центрального индекса до конца, а : индексирует все столбцы. Все эти индексированные элементы установлены в 0, чтобы представлять цвет черный.

Функция CLASS используется для получения типа данных A, так что 0 можно применить к этому типу с помощью функции CAST. Это может не обязательно, однако, поскольку 0, вероятно, будет автоматически преобразован в тип A без них.

Если вы хотите создать logical index использовать в качестве маски, вы можете сделать следующее:

mask = true(size(A)); %# Create a matrix of true values the same size as A 
centerIndex = round(size(A,1)/2); %# Get the center index for the rows 
mask(centerIndex:end,:) = false; %# Set the lower half to false 

Теперь mask логическая матрица с true (т.е. «1») для пикселей вы хотите сохранить и false (т. е. «0») для пикселей, которые вы хотите установить на 0. Вы можете установить больше элементов mask до false, как вы пожелаете. Затем, когда вы хотите применить маску, вы можете сделать следующее:

A(~mask) = 0; %# Set all elements in A corresponding 
       %# to false values in mask to 0 
+0

Спасибо за код :) Не могли бы вы объяснить, что делает код в деталях? Я хотел бы узнать, как это работает :) Можете ли вы также сказать мне, как я могу также маскировать определенную часть вместо половины? потому что выясняется, что мне нужно замаскировать несколько вертикальных пикселей из верхней части изображения. СПАСИБО! – NLed

+0

@ZaZu: проблем нет. ;) Я обновил свой ответ с объяснением и кодом для создания логической маски. – gnovice

+0

Спасибо alot :) Одна проблема, хотя логический индекс, используемый для маскировки, не работает здесь :(Im не уверен, почему !!Предыдущий работает хорошо, но он сокращает последнюю точку, где падает объект (объект падает немного после 1/2 размера изображения). Есть ли способ, которым я могу использовать первый метод для блокировки верхнего пространства? ** РЕДАКТИРОВАТЬ ** Могу ли я использовать способ блокировки определенных пикселей? У меня есть изображение 480x640. – NLed

0
function masked = maskout(src,mask) 
    % mask: binary, same size as src, but does not have to be same data type (int vs logical) 
    % src: rgb or gray image 
    masked = bsxfun(@times, src, cast(mask,class(src))); 
end 
Смежные вопросы