2012-04-15 11 views
2

У меня есть изображение с 3 цветами в matlab, значение 0, 128 и 255. например:Проверка пикселей в Matlab

255 255 255 255 128 255 0 255 255 128 0 255 
255 0 255 255 128 255 255 0 255 128 255 255 
255 0 255 0 128 255 255 255 255 128 255 0  
255 255 0 255 128 255 255 0 255 128 255 255 
255 0 0 255 128 0 255 255 0 128 255 0  

Во-первых, я хочу, чтобы проверить пиксели индекса (1,1) к (1,5).

Если значение пикселя 0 (черный), то пиксели индекса (1,1) к (1,5) изменяется на 128 (серый), если нет, то пиксели изменяются на 0 (белый).

Во-вторых, я хочу, чтобы сделать эти шаги снова, проверка индекса (2,1) к (2,5), (3,1) к (3,5), до дна, а затем переходите к следующему, к индексу (1,6) к (1,10), (2,6) к (2,10), вплоть до снизу, затем перешли к индексу (1,11) - (1,end), (2,11) - (2,end).

ответ

3

Вам нужно делать это последовательно? Похоже, вам нужно сделать это для каждой группы формы (n, (5 * m: 5 * m +1)). Если это так, вы можете выполнить все тесты одновременно, изменив матрицу на 3d-матрицу блоков, которые имеют 5 элементов. Также я предполагаю, что вы имели в виду «если нет, то пиксели меняются на 255 (белый)», а не 0.

Предположим, изображение называется myImage, то

numBlocks = numel(myImage)/(5*size(myImage,1)); 
% Generate a 3D matrix each of which is 5 elements long in dimension 2. Note reshape will throw an error if numblocks is fractional 
foo = reshape(myImage,size(myImage,1),5,numBlocks); 
blackTest = any(foo==0,2); 
result = blackTest * 128 + ~blackTest*255; % result for each block 
output = reshape(repmat(result,[1 5 1]),size(myImage)); 

Это реорганизует изображение в 3D-матрицу, где каждая подматрица, соответствующая каждому «слой» в 3d матрицы составляет 5 элементов в ширину. Для всей 3d-матрицы он проверяет, равен ли какой-либо из элементов в размерности 2, оставляя логическую матрицу foo длины 1 в размерности 2. foo состоит из логических и нулей, которые в MATLAB также могут рассматриваться как числовые и нули , Поэтому он умножает foo на 128 (для значения серого вывода) и добавляет логический обратный foo, умноженный на 255, чтобы получить ваши белые выходные значения. Наконец, он повторяет матрицу обратно в 5-элементные блоки и восстанавливает ее до первоначальных размеров.

Редактировать: Обратите внимание, что, как упоминалось в комментарии к коду, этот код не будет работать, если исходное изображение не кратно 5 пикселей в ширину. Чтобы исправить это, вам нужно создать специальный случай или использовать цикл для перехода через каждый 5-элементный блок. В самом деле, что может быть лучше подход со всех сторон:

index = 1; 
output = zeros(size(myImage)); 

while index < size(myImage,2) 
blockEnd = min(index+4,size(myImage,2)); 
blackTest = any(myImage(:,index:blockEnd)==0,2); 
blackTest = blackTest(:,ones(1,5)); 
output(1:end,index:blockEnd) = blackTest * 128 + ~blackTest*255; 
index = index+5; 
end 
+0

у меня нет достаточного количества респ для комментирования привилегии, поэтому я упомяну здесь ответ, что zenpoy подобен, но более элегантно, чем мое первое решение выше. Насколько я могу судить, он также страдает от того же ограничения, что и у нескольких 5. –

+0

спасибо за помощь. Я нашел способ для случая не кратным 5 пикселей в ширину. Я добавляю, что столбец будет кратным 5, тогда конечный результат я взял только начало матрицы. – Wahyu

+0

Да, это сработает, но вам нужно убедиться, что добавляемые столбцы не содержат нулей или вы будете искажать результат. –

1
% generate matrix 
rand_data = randi(10,10); 
I = zeros(10); 
I(rand_data < 6 & rand_data > 3) = 128; 
I(rand_data >= 6) = 255; 

% here's the code 
I = reshape(I',5,[])'; 
mask = repmat(any(I == 0,2),5,1); 
I(mask) = 128; 
I(~mask) = 255; 
I = reshape(I',10,[])'; 
+0

Спасибо, ты мне очень помог. – Wahyu

Смежные вопросы