2010-10-31 1 views
1

Я использую Octave для анализа некоторых изображений. Теперь я использую две вложенные петли для доступа к каждому пикселю, но это очень медленно.Быстрый доступ к пикселам в Octave

Мой код-то вроде этого:

for i = 1:size(im,1) 
    for j = 1:size(im,2) 
    p = im(i,j,1:3); 
     if (classRGB(class, [p(1),p(2),p(3)]) > 0) 
      ## Apply some function to that pixel here 
     endif 
    endfor 
endfor 

Есть ли способ сделать это без петель в октаве?

Заранее спасибо.

ответ

0

У меня нет знака в Octave, но на других языках самым быстрым способом является получение указателя на массив байтов, представляющий пиксели изображения и итерацию. Например, некоторые псевдо-код при условии uint8 размера цвета:

 
uint8 *ptr = getBytes(image); 
foreach row{ 
    for each pixel{ 
     Red = *ptr; ptr++; 
     Green = *ptr; ptr++; 
     Blue = *prr; ptr++; 
     do something with Red, Green, Blue (or Alpha) 
    } 
} 

Вы должны быть осторожны, чтобы знать, что вы набивка изображения использовать тип данных в конце каждой строки.

+0

Насколько мне известно, это невозможно сделать в Октаве. Но все равно спасибо. – OctaveNoob

+0

Вы можете всегда взаимодействовать с кодом C++ по соображениям производительности. – Ross

+0

Извините, но проект должен быть выполнен в Octave. Мое текущее решение работает достаточно хорошо, но оно очень медленное. Я думаю, что мне нужно сделать некоторую кодировку вектора, но я просто не знаю, как это сделать. – OctaveNoob

4

Я рекомендую использовать более ориентированный на матрицу подход. MATLAB/Octave работает очень медленно при использовании петель.

Например, скажем, я хочу создать RGB изображение, где пиксели, чьи оттенки серого преобразования значения (0.3 * R + 0,6 * G + 0,1 * В) меньше или равно 128 устанавливаются в ноль:

# Read a 512x512 RGB image. 
# Resulting matrix size is [512 512 3] 
im = imread('lena_rgb.png'); 

# Compute grayscale value (could be done more accurately with rgb2gray). 
# Resulting matrix size is [512 512 1] (same as [512 512]) 
grayval = 0.3*im(:,:,1) + 0.6*im(:,:,2) + 0.1*im(:,:,3); 

# Create a bitmask of grayscale values above 128 
# Contains 0 if less than or equal than 128, 1 if greater than 128 
# Resulting matrix size is [512 512 1] (same as [512 512]) 
mask = (grayval > 128); 

# Element-wise multiply the mask with the input image to get the new RGB image 
# Resulting matrix size is [512 512 3] 
result = im.* repmat(mask, [1 1 3]); 

Я рекомендую узнать больше о матричной манипуляции, арифметике и адресации в Octave. Я включил оригинальные и результирующие изображения моего примера для справки. Original Image Result Image

+0

Это то, что мне нужно. Спасибо – OctaveNoob

+0

[Этот предыдущий вопрос] (http://stackoverflow.com/q/2470844/448455) предоставляет полезные ссылки для улучшения производительности MATLAB/Octave: [Руководство по векторизации кода] (http://www.mathworks.com/support/ tech-notes/1100/1109.html) и [Методы повышения производительности] (http://www.mathworks.com/help/techdoc/matlab_prog/f8-784135.html). –

0

Вы должны сказать нам, что classRGB делает. Иначе никто не сможет вам помочь. Если classRGB можно вычислить для матрицы значений сразу, вы можете напрямую передать матрицу im(:,:,1:3).

+0

Я реализовал ответ Хайме и отлично работает. Но спасибо за ваш интерес – OctaveNoob

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