Ik heb de onderstaande code waarmee ik een point cloud plot in de CIELAB kleurruimte van alle kleuren in de Adobe RGB kleurruimte op basis van een gammawaarde van 2.2 en een kleurdiepte van 5 bits per kleurkanaal. (allcomb-functie nodig van File Exchange om code te runnen)
Nu wil ik die point cloud omzetten naar een surface en dat dacht ik te doen met de onderstaande code:
Maar het resultaat daarvan is niet zoals ik het wil. Ik wil namelijk dat de resulterende surface ook echt door alle buitenste punten snijden, nu is dat bij concave vlakken niet het geval. Daarnaast worden er veel te veel driehoeken berekend. Want "tri" is nu een 205317 x 4 double, terwijl er maar 32768 kleuren zijn. Het aantal driehoeken waar de surface uit bestaat zou juist veel kleiner moeten zijn dan het aantal kleuren. Nu worden er ook driehoeken berekend door de point cloud heen, daarnaast worden sommige driehoeken van de surface juist niet berekend (waarschijnlijk door de volgorde waarin RGB gegenereerd is).
Ook zou ik graag de kleuren van de surface laten overeenkomen met de juiste kleuren (RGB_gamma, zoals ook in de patch-plot).
Geïnstalleerde toolboxes:
EDIT: de onderstaande afbeelding is zoals ik het zou willen hebben (klik voor groot). Dit heb ik nu gedaan met de patch-plot door een kleurdiepte van 9 bit per kanaal te kiezen (hoogste wat ik met 24 GB RAM kan uitrekenen), zodat het door het grote aantal punten alsnog een oppervlak lijkt. Maar dat wil ik dus graag als echte surface.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| tic
format long % sets number of decimals for doubles to 15
N = 5; % color depth per channel in bits
Gamma = 2.2; % Gamma
Rx = 0.64; % x-coordinate of red primary of Adobe RGB
Ry = 0.33; % y-coordinate of red primary of Adobe RGB
Gx = 0.21; % x-coordinate of green primary of Adobe RGB
Gy = 0.71; % y-coordinate of green primary of Adobe RGB
Bx = 0.15; % x-coordinate of blue primary of Adobe RGB
By = 0.06; % y-coordinate of blue primary of Adobe RGB
Xw = 0.95047; % X-values for CIE Standard Illuminant D65 (Bruce Lindbloom)
Yw = 1; % Y-values for CIE Standard Illuminant D65 (Bruce Lindbloom)
Zw = 1.08883; % Z-values for CIE Standard Illuminant D65 (Bruce Lindbloom)
max_lvl = 2^N-1; % highest value for channel for selected color depth
R = 0:1:max_lvl; % creates red channel row vector
R = transpose(R); % transpose row vector to column vector
G = R; % creates green channel column vector
B = R; % creates blue channel column vector
RGB = allcomb(R,G,B); % creates matrix with all possible RGB combinations (m-file for allcomb function attached)
RGB_norm = RGB/max_lvl; % normalizes RGB matrix so that the values range from 0 to 1
RGB_gamma = RGB_norm.^Gamma; % adds gamma encoding to normalized RGB matrix
clear RGB RGB_norm
Xr = Rx/Ry;
Yr = 1;
Zr = (1-Rx-Ry)/Ry;
Xg = Gx/Gy;
Yg = 1;
Zg = (1-Gx-Gy)/Gy;
Xb = Bx/By;
Yb = 1;
Zb = (1-Bx-By)/By;
XYZ_rgb = [Xr Xg Xb; Yr Yg Yb; Zr Zg Zb];
XYZ_rgb_inv = inv(XYZ_rgb);
XYZ_w = [Xw; Yw; Zw]; % simple version using built-in values for D65 is XYZ_w = transpose(whitepoint('d65'));
S_rgb = XYZ_rgb_inv * XYZ_w;
M= zeros(size(XYZ_rgb));
M(:,1) = XYZ_rgb(:,1) * S_rgb(1,1);
M(:,2) = XYZ_rgb(:,2) * S_rgb(2,1);
M(:,3) = XYZ_rgb(:,3) * S_rgb(3,1);
XYZ = transpose(M * transpose(RGB_gamma)); % creates XYZ matrix from RGB matrix using transformation matrix M
epsilon = 216/24389 * ones(size(XYZ,1),1);
kappa = 24389/27;
x_r = XYZ(:,1)/XYZ_w(1,1);
y_r = XYZ(:,2)/XYZ_w(2,1);
z_r = XYZ(:,3)/XYZ_w(3,1);
clear XYZ
mask = x_r > epsilon;
x_r( mask ) = x_r( mask ) .^ (1/3);
x_r( ~mask ) = ( kappa * x_r( ~mask ) + 16 ) / 116;
mask = y_r > epsilon;
y_r( mask ) = y_r( mask ) .^ (1/3);
y_r( ~mask ) = ( kappa * y_r( ~mask ) + 16 ) / 116;
mask = z_r > epsilon;
z_r( mask ) = z_r( mask ) .^ (1/3);
z_r( ~mask ) = ( kappa * z_r( ~mask ) + 16 ) / 116;
L = 116*y_r-16;
a = 500*(x_r-y_r);
b = 200*(y_r-z_r);
clear epsilon x_r y_r z_r mask
toc
tic
figure(1);
patchinfo.Vertices = horzcat(a,b,L);
patchinfo.Faces = [1:2^N^3]';
p = patch(patchinfo,'Marker','.','MarkerSize',1,'EdgeColor','interp','FaceVertexCData',RGB_gamma);
axis equal;
axis([min(a)-10 max(a)+10 min(b)-10 max(b)+10 min(L)-10 max(L)+10]);
grid on;
whitebg([0.5,0.5,0.5]);
view(3);
toc |
Nu wil ik die point cloud omzetten naar een surface en dat dacht ik te doen met de onderstaande code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| tic tri = delaunay(a,b,L); toc tic figure(2); trisurf(tri,a,b,L,'EdgeColor','none','LineStyle','none','FaceLighting','gouraud'); axis equal; axis([min(a)-10 max(a)+10 min(b)-10 max(b)+10 min(L)-10 max(L)+10]); grid on; whitebg([0.5,0.5,0.5]); view(3); toc |
Maar het resultaat daarvan is niet zoals ik het wil. Ik wil namelijk dat de resulterende surface ook echt door alle buitenste punten snijden, nu is dat bij concave vlakken niet het geval. Daarnaast worden er veel te veel driehoeken berekend. Want "tri" is nu een 205317 x 4 double, terwijl er maar 32768 kleuren zijn. Het aantal driehoeken waar de surface uit bestaat zou juist veel kleiner moeten zijn dan het aantal kleuren. Nu worden er ook driehoeken berekend door de point cloud heen, daarnaast worden sommige driehoeken van de surface juist niet berekend (waarschijnlijk door de volgorde waarin RGB gegenereerd is).
Ook zou ik graag de kleuren van de surface laten overeenkomen met de juiste kleuren (RGB_gamma, zoals ook in de patch-plot).
Geïnstalleerde toolboxes:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| MATLAB Version 8.3 (R2014a) Simulink Version 8.3 (R2014a) Communications System Toolbox Version 5.6 (R2014a) Computer Vision System Toolbox Version 6.0 (R2014a) Control System Toolbox Version 9.7 (R2014a) Curve Fitting Toolbox Version 3.4.1 (R2014a) DSP System Toolbox Version 8.6 (R2014a) Data Acquisition Toolbox Version 3.5 (R2014a) Global Optimization Toolbox Version 3.2.5 (R2014a) Image Acquisition Toolbox Version 4.7 (R2014a) Image Processing Toolbox Version 9.0 (R2014a) Instrument Control Toolbox Version 3.5 (R2014a) MATLAB Report Generator Version 3.16 (R2014a) Mapping Toolbox Version 4.0.1 (R2014a) Neural Network Toolbox Version 8.2 (R2014a) Optimization Toolbox Version 7.0 (R2014a) Parallel Computing Toolbox Version 6.4 (R2014a) Partial Differential Equation Toolbox Version 1.4 (R2014a) Phased Array System Toolbox Version 2.2 (R2014a) Signal Processing Toolbox Version 6.21 (R2014a) SimDriveline Version 2.6 (R2014a) SimElectronics Version 2.5 (R2014a) SimEvents Version 4.3.2 (R2014a) SimMechanics Version 4.4 (R2014a) SimPowerSystems Version 6.1 (R2014a) Simscape Version 3.11 (R2014a) Simulink 3D Animation Version 7.1 (R2014a) Simulink Control Design Version 4.0 (R2014a) Simulink Design Optimization Version 2.5 (R2014a) Simulink Report Generator Version 3.16 (R2014a) Stateflow Version 8.3 (R2014a) Statistics Toolbox Version 9.0 (R2014a) Symbolic Math Toolbox Version 6.0 (R2014a) Wavelet Toolbox Version 4.13 (R2014a) |
EDIT: de onderstaande afbeelding is zoals ik het zou willen hebben (klik voor groot). Dit heb ik nu gedaan met de patch-plot door een kleurdiepte van 9 bit per kanaal te kiezen (hoogste wat ik met 24 GB RAM kan uitrekenen), zodat het door het grote aantal punten alsnog een oppervlak lijkt. Maar dat wil ik dus graag als echte surface.
[ Voor 27% gewijzigd door Kid Jansen op 20-03-2015 01:31 ]