Image 快速访问倍频程像素
我用八度音阶来分析一些图像。现在我使用两个嵌套for循环来访问每个像素,但这真的很慢 我的代码是这样的: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 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的答案,效果很好。但是谢谢你的关注