我有一张图像,我必须在其上滑动81 * 81窗口,以便找到中心像素与周围81 * 81窗口中每个像素之间的强度距离(差异),我也要找出来位置距离是中心像素坐标与周围窗口中存在的像素的坐标之间的差异。如果我使用for循环,那么我将不得不使用4个嵌套for循环进行此操作,这对于单个图像需要将近一整天。我想为图像中存在的每个像素存储81 * 81强度差异,同样地存储位置距离,这往往会产生4D变量。任何人都可以建议我这样做的有效方法。以下是我编写此代码的方法:
I = imread('House.tiff');
YCbCr = rgb2ycbcr(I);
YCbCr = double(YCbCr);
YCbCr = imresize(YCbCr,[200 200]);
[m n v] = size(YCbCr);
Y = YCbCr(:,:,1); Cb = YCbCr(:,:,2); Cr =YCbCr(:,:,3);
Y1 = padarray(Y,[20,20]);
Cb1 = padarray(Cb,[20,20]);
Cr1 = padarray(Cr,[20,20]);
window_size = 41;
p = (window_size-1)/2;
Dl = zeros(m,n,41,41); Df = zeros(m,n,41,41);
for x = 1:1:m
for y = 1:1:n
for a = -p:1:p
for b = -p:1:p
Df(x,y,a+p+1,b+p+1)= abs(Y(x,y)-Y1(x+a+p,y+b+p))+ abs(Cb(x,y)- Cb1(x+a+p,y+b+p))+ abs(Cr(x,y)- Cr1(x+a+p,y+b+p));%% intensity distance
Dl(x,y,a+p+1,b+p+1) = max(abs((x+p)-(x+a+p)),abs((y+p)-(y+b+p)));%% location distance
end
end
end
end
答案 0 :(得分:0)
对于那个81 x 81的滑动窗口,你可能有一个X和Y"初始"点。 假设,创建一个新的临时窗口,在80x80窗口中裁剪那些质心之间的初始图像。
new_image = image(X-40:X+40,Y-40:Y+40);
这将以快速的方式为您创建新的临时图像。
一直存储像素的值
for i=1:length(images)
currentImage=image(i,1);
new_image(i)=currentImage(X-40:X+40,Y-40:Y+40);
end
答案 1 :(得分:0)
a)您的位置差异矩阵始终相同 - 它不依赖于Y.只需创建一个81x81的实例。
b)为什么需要存储所有这些输出?花费很长的时间可能很容易,因为这种大矩阵的RAM使用意味着你正在读取和写入磁盘(页面文件)而不是RAM,这将减慢很多事情。在"下一阶段"进行优化可能会更好。这个算法,减少了你用这个矩阵实际做的事情的计算。根据您的下一阶段,使用imfilter
可能是最佳选择。