Быстрый доступ к пикселям в октаве - PullRequest
1 голос
/ 31 октября 2010

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

Мой код выглядит примерно так:

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

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

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

Ответы [ 3 ]

4 голосов
/ 02 ноября 2010

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

Например, скажем, я хочу создать изображение RGB, в котором пиксели, значения преобразования в градациях серого (0,3 * R + 0,6 * G + 0,1 * B) которых меньше или равны 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]);

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

0 голосов
/ 14 ноября 2010

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

0 голосов
/ 01 ноября 2010

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

</p> <pre> 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) } } </pre> <p>

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

...