Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1136)

Side by Side Diff: webrtc/modules/video_processing/main/test/unit_test/createTable.m

Issue 1410663004: modules/video_processing: refactor interface->include + more. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebased Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 % Create the color enhancement look-up table and write it to
2 % file colorEnhancementTable.cpp. Copy contents of that file into
3 % the source file for the color enhancement function.
4
5 clear
6 close all
7
8
9 % First, define the color enhancement in a normalized domain
10
11 % Compander function is defined in three radial zones.
12 % 1. From 0 to radius r0, the compander function
13 % is a second-order polynomial intersecting the points (0,0)
14 % and (r0, r0), and with a slope B in (0,0).
15 % 2. From r0 to r1, the compander is a third-order polynomial
16 % intersecting the points (r0, r0) and (r1, r1), and with the
17 % same slope as the first part in the point (r0, r0) and slope
18 % equal to 1 in (r1, r1).
19 % 3. For radii larger than r1, the compander function is the
20 % unity scale function (no scaling at all).
21
22 r0=0.07; % Dead zone radius (must be > 0)
23 r1=0.6; % Enhancement zone radius (must be > r0 and < 1)
24 B=0.2; % initial slope of compander function (between 0 and 1)
25
26 x0=linspace(0,r0).'; % zone 1
27 x1=linspace(r0,r1).'; % zone 2
28 x2=linspace(r1,1).'; % zone 3
29
30 A=(1-B)/r0;
31 f0=A*x0.^2+B*x0; % compander function in zone 1
32
33 % equation system for finding second zone parameters
34 M=[r0^3 r0^2 r0 1;
35 3*r0^2 2*r0 1 0;
36 3*r1^2 2*r1 1 0;
37 r1^3 r1^2 r1 1];
38 m=[A*r0^2+B*r0; 2*A*r0+B; 1; r1];
39 % solve equations
40 theta=M\m;
41
42 % compander function in zone 1
43 f1=[x1.^3 x1.^2 x1 ones(size(x1))]*theta;
44
45 x=[x0; x1; x2];
46 f=[f0; f1; x2];
47
48 % plot it
49 figure(1)
50 plot(x,f,x,x,':')
51 xlabel('Normalized radius')
52 ylabel('Modified radius')
53
54
55 % Now, create the look-up table in the integer color space
56 [U,V]=meshgrid(0:255, 0:255); % U-V space
57 U0=U;
58 V0=V;
59
60 % Conversion matrix from normalized YUV to RGB
61 T=[1 0 1.13983; 1 -0.39465 -0.58060; 1 2.03211 0];
62 Ylum=0.5;
63
64 figure(2)
65 Z(:,:,1)=Ylum + (U-127)/256*T(1,2) + (V-127)/256*T(1,3);
66 Z(:,:,2)=Ylum + (U-127)/256*T(2,2) + (V-127)/256*T(2,3);
67 Z(:,:,3)=Ylum + (U-127)/256*T(3,2) + (V-127)/256*T(3,3);
68 Z=max(Z,0);
69 Z=min(Z,1);
70 subplot(121)
71 image(Z);
72 axis square
73 axis off
74 set(gcf,'color','k')
75
76 R = sqrt((U-127).^2 + (V-127).^2);
77 Rnorm = R/127;
78 RnormMod = Rnorm;
79 RnormMod(RnormMod==0)=1; % avoid division with zero
80
81 % find indices to pixels in dead-zone (zone 1)
82 ix=find(Rnorm<=r0);
83 scaleMatrix = (A*Rnorm(ix).^2 + B*Rnorm(ix))./RnormMod(ix);
84 U(ix)=(U(ix)-127).*scaleMatrix+127;
85 V(ix)=(V(ix)-127).*scaleMatrix+127;
86
87 % find indices to pixels in zone 2
88 ix=find(Rnorm>r0 & Rnorm<=r1);
89 scaleMatrix = (theta(1)*Rnorm(ix).^3 + theta(2)*Rnorm(ix).^2 + ...
90 theta(3)*Rnorm(ix) + theta(4)) ./ RnormMod(ix);
91 U(ix)=(U(ix)-127).*scaleMatrix + 127;
92 V(ix)=(V(ix)-127).*scaleMatrix + 127;
93
94 % round to integer values and saturate
95 U=round(U);
96 V=round(V);
97 U=max(min(U,255),0);
98 V=max(min(V,255),0);
99
100 Z(:,:,1)=Ylum + (U-127)/256*T(1,2) + (V-127)/256*T(1,3);
101 Z(:,:,2)=Ylum + (U-127)/256*T(2,2) + (V-127)/256*T(2,3);
102 Z(:,:,3)=Ylum + (U-127)/256*T(3,2) + (V-127)/256*T(3,3);
103 Z=max(Z,0);
104 Z=min(Z,1);
105 subplot(122)
106 image(Z);
107 axis square
108 axis off
109
110 figure(3)
111 subplot(121)
112 mesh(U-U0)
113 subplot(122)
114 mesh(V-V0)
115
116
117
118 % Last, write to file
119 % Write only one matrix, since U=V'
120
121 fid = fopen('../out/Debug/colorEnhancementTable.h','wt');
122 if fid==-1
123 error('Cannot open file colorEnhancementTable.cpp');
124 end
125
126 fprintf(fid,'//colorEnhancementTable.h\n\n');
127 fprintf(fid,'//Copy the constant table to the appropriate header file.\n\n');
128
129 fprintf(fid,'//Table created with Matlab script createTable.m\n\n');
130 fprintf(fid,'//Usage:\n');
131 fprintf(fid,'// Umod=colorTable[U][V]\n');
132 fprintf(fid,'// Vmod=colorTable[V][U]\n');
133
134 fprintf(fid,'static unsigned char colorTable[%i][%i] = {\n', size(U,1), size(U,2 ));
135
136 for u=1:size(U,2)
137 fprintf(fid,' {%i', U(1,u));
138 for v=2:size(U,1)
139 fprintf(fid,', %i', U(v,u));
140 end
141 fprintf(fid,'}');
142 if u<size(U,2)
143 fprintf(fid,',');
144 end
145 fprintf(fid,'\n');
146 end
147 fprintf(fid,'};\n\n');
148 fclose(fid);
149 fprintf('done');
150
151
152 answ=input('Create test vector (takes some time...)? y/n : ','s');
153 if answ ~= 'y'
154 return
155 end
156
157 % Also, create test vectors
158
159 % Read test file foreman.yuv
160 fprintf('Reading test file...')
161 [y,u,v]=readYUV420file('../out/Debug/testFiles/foreman_cif.yuv',352,288);
162 fprintf(' done\n');
163 unew=uint8(zeros(size(u)));
164 vnew=uint8(zeros(size(v)));
165
166 % traverse all frames
167 for k=1:size(y,3)
168 fprintf('Frame %i\n', k);
169 for r=1:size(u,1)
170 for c=1:size(u,2)
171 unew(r,c,k) = uint8(U(double(v(r,c,k))+1, double(u(r,c,k))+1));
172 vnew(r,c,k) = uint8(V(double(v(r,c,k))+1, double(u(r,c,k))+1));
173 end
174 end
175 end
176
177 fprintf('\nWriting modified test file...')
178 writeYUV420file('../out/Debug/foremanColorEnhanced.yuv',y,unew,vnew);
179 fprintf(' done\n');
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698