Image 快速访问倍频程像素

Image 快速访问倍频程像素,image,pixel,octave,Image,Pixel,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 endf

我用八度音阶来分析一些图像。现在我使用两个嵌套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
有没有办法在没有八度音阶的情况下做到这一点


提前感谢。

我不知道倍频程,但在其他语言中,最快的方法是获取表示图像像素的字节数组指针并进行迭代。例如,假设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) } } uint8*ptr=getBytes(图像); 每行{ 对于每个像素{ 红色=*ptr;ptr++; 绿色=*ptr;ptr++; 蓝色=*prr;ptr++; 用红、绿、蓝(或阿尔法)做一些事情 } }


必须仔细了解图像数据类型在每行末尾使用的填充

我建议采取更面向矩阵的方法。使用循环时,MATLAB/倍频程非常慢

例如,假设我想创建一个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]);
我建议学习更多关于矩阵操作、算术和寻址的知识。我包括了我的示例的原始图像和结果图像,以供参考。
您需要告诉我们
classRGB
的功能。否则没人能帮你。如果可以立即计算值矩阵的
classRGB
,则可以直接将矩阵
im(:,:,1:3)

传递给我,据我所知,这不能在八度音程中完成。但是无论如何,谢谢。由于性能原因,你总是可以与C++代码接口。抱歉,项目必须在八度音阶中完成。我当前的解决方案运行得很好,但速度非常慢。我想我必须做一些代码矢量化,但我不知道怎么做。这正是我需要的。感谢为MATLAB/Octave性能改进提供了有用的链接:和。我已经实现了Jaime的答案,效果很好。但是谢谢你的关注