3 views (last 30 days)

Show older comments

I have a function which calculates square distance between pixels, however it wants to calculate the distance between 2 pixels which has a 1x1x3 array.

For example, inputs P and Q both have 1 row, 1 column and 3 colour layers, and single output is squared distance.

I found this function on matlab forums which calculates squared distance and it gives correct results: https://ww2.mathworks.cn/matlabcentral/answers/479129-how-can-i-have-multiple-arrays-as-an-input-for-my-function

function [SquaredDistance] = PixelDistance(P,Q)

P1 = P(1); P2 = P(2); P3 = P(3);

Q1 = Q(1); Q2 = Q(2); Q3 = Q(3);

SquaredDistance = (P1-Q1)^2 + (P2-Q2)^2 + (P3-Q3)^2;

end

However, if I have a table (as an example) like this: (where :,:,1 is red values :,:,2 is green values etc)

Colours(:,:,1) =

143

156

231

Colours(:,:,2) =

37

139

142

Colours(:,:,3) =

30

22

65

How do we calculate squared value using input commands such as P = Colours(1,1,:) and Q = Colours(3,1,:) using the code?

Jos (10584)
on 7 Sep 2019

The function you found is rather badly coded ...

Another expression for "calculating a distance" is "taking the norm". Matlab has a function for that, called NORM :-) When you have two points in 3D (colour, RGB) space, P and Q, represented as vectors with three values, you can calculated the distance by looking at the vector between P and Q:

P = [10 ; 100 ; 10], Q = [30 ; 40 ; 50] % example

norm(P-Q) % which is the same as

sqrt(sum((P-Q).^2))

In your examples you have a your 3D points (vectors) stacked up in a single array Colours. It looks like Colours is a 3-by-1-by-3 array. You can get rid of the obfusciating second dimension using squeeze

Colours = randi(100,[3 1 3]) % example of your data ??

C = squeeze(Colours) % a 3-by-3 array: each column is a point

norm((C(1,:)-C(2,:)))

Jos (10584)
on 7 Sep 2019

Sara Foster
on 7 Sep 2019

Jos (10584)
on 8 Sep 2019

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!