2010-10-31 97 views
1

我正在使用Octave分析一些图像。现在我使用两个嵌套的for-loops来访问每个像素,但这非常慢。快速访问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

据我所知,这不能在Octave中完成。不过谢谢。 – OctaveNoob 2010-11-01 09:55:35

+0

出于性能原因,您总是可以与C++代码进行交互。 – Ross 2010-11-01 13:26:31

+0

抱歉,该项目必须在Octave中完成。我目前的解决方案效果很好,但速度很慢。我认为我必须做一些代码向量化,但我只是不知道如何。 – OctaveNoob 2010-11-01 20:05:47

4

我建议采取更面向矩阵的方法。使用循环时,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]); 

我建议在Octave中学习更多关于矩阵操作,算术和寻址的知识。我包含了我的示例的原始和结果图像以供参考。 Original Image Result Image

+0

这正是我所需要的。谢谢 – OctaveNoob 2010-11-01 21:06:36

+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)。 – 2010-11-01 21:11:40

0

您需要告诉我们什么classRGB会做什么。否则,没有人可以帮助你。如果classRGB可以一次计算值的矩阵,您可以直接通过矩阵im(:,:,1:3)

+0

我已经实现了Jaime的答案,并且工作得很好。但是,谢谢你的兴趣 – OctaveNoob 2010-11-19 10:07:04