在MATLAB中,我有一个256x256的RGB图像和一个3x3的核,可以对其进行操作。 3x3的核计算核内9个像素之间的颜色欧几里得距离,并将最大值存储在数组中。然后,它移动1个像素并执行相同的计算,以此类推。
我可以很容易地编写移动核心到图像上的代码,以及从核心像素中提取RGB值的代码。但是,我确实遇到了计算每对像素之间的颜色欧几里得距离的效率问题。
例如,如果我有一个以下值的3x3矩阵:
[55 12 5; 77 15 99; 124 87 2]
我需要编写一个循环,使第一个元素与第二个、第三个...第九个元素执行操作。然后第二个元素与第三个、第四个...第九个元素执行操作,以此类推,直到最后一个元素与第九个元素执行操作。最好不要重复计算相同的像素组合(例如,如果您已经计算了第2个和第7个,则不要再计算第7个和第2个)。
提前感谢你。
编辑:到目前为止我的代码如下:
我可以很容易地编写移动核心到图像上的代码,以及从核心像素中提取RGB值的代码。但是,我确实遇到了计算每对像素之间的颜色欧几里得距离的效率问题。
例如,如果我有一个以下值的3x3矩阵:
[55 12 5; 77 15 99; 124 87 2]
我需要编写一个循环,使第一个元素与第二个、第三个...第九个元素执行操作。然后第二个元素与第三个、第四个...第九个元素执行操作,以此类推,直到最后一个元素与第九个元素执行操作。最好不要重复计算相同的像素组合(例如,如果您已经计算了第2个和第7个,则不要再计算第7个和第2个)。
提前感谢你。
编辑:到目前为止我的代码如下:
K=3;
s=1; %If S=0, don't reject, If S=1 Reject first max distance pixel pair
OI=imread('onion.png');
Rch = im2col(OI(:,:,1),[K,K],'sliding')
Gch = im2col(OI(:,:,2),[K,K],'sliding')
Bch = im2col(OI(:,:,3),[K,K],'sliding')
indexes = bsxfun(@gt,(1:K^2)',1:K^2)
a=find(indexes);
[idx1,idx2] = find(indexes);
Rsqdiff = (Rch(idx2,:) - Rch(idx1,:)).^2
Gsqdiff = (Gch(idx2,:) - Gch(idx1,:)).^2
Bsqdiff = (Bch(idx2,:) - Bch(idx1,:)).^2
dists = sqrt(double(Rsqdiff + Gsqdiff + Bsqdiff)) %Distance values for all 36 combinations in 1 column
[maxdist,idx3] = max(dists,[],1) %idx3 is each column's index of max value
if s==0
y = reshape(maxdist,size(OI,1)-K+1,[]) %max value of each column (each column has 36 values)
elseif s==1
[~,I]=max(maxdist);
idx3=idx3(I);
n=size(idx3,2);
for i=1:1:n
idx3(i)=a(idx3(i));
end
[I,J]=ind2sub([K*K K*K],idx3);
for j=1:1:a
[M,N]=ind2sub([K*K K*K],dists(j,:));
M(I,:)=0;
N(:,J)=0;
dists(j,:)=sub2ind; %Incomplete line, don't know what to do here
end
[maxdist,idx3] = max(dists,[],1);
y = reshape(maxdist,size(OI,1)-K+1,[]);
end