Implement get_meter function
authorLukáš Jiřiště <jiriste@icpf.cas.cz>
Mon, 19 Aug 2024 15:09:00 +0000 (17:09 +0200)
committerLukáš Jiřiště <jiriste@icpf.cas.cz>
Mon, 19 Aug 2024 15:09:00 +0000 (17:09 +0200)
This function return a (polynomial) function (handle) which takes
coordinates in pixels in and returns coordinates in meters.
The order of the polynomial may specified in the third input with first
order (linear) being default.

Bubliny.m
get_mark_frequency.m [new file with mode: 0644]
get_mark_indeces.m [new file with mode: 0644]
get_meter.m [new file with mode: 0644]
get_meter_picture.m [new file with mode: 0644]

index a2f26fa52ed99fa4308c6a3215b1e7a2ad658e10..89cb88a02621e4725d43686493059bcf16451aaf 100755 (executable)
--- a/Bubliny.m
+++ b/Bubliny.m
@@ -115,5 +115,7 @@ for iii=1:nSelectedDirectory  % Cycles for directories with files
        imshow(meanfig .* uint8(mask));\r
        figure\r
        plot(mean(double(meanfig), Weights = mask));\r
+       \r
+       meter = get_meter(maxfig, mask);\r
 \r
 end  % iii, Cycles for directories with files\r
diff --git a/get_mark_frequency.m b/get_mark_frequency.m
new file mode 100644 (file)
index 0000000..2f67b2a
--- /dev/null
@@ -0,0 +1,23 @@
+function mark_freq = get_mark_frequency(intensity, inverse_sensitivity)
+       if nargin < 3
+               inverse_sensitivity = 40;
+       end
+
+       freq = fft(intensity - mean(intensity));
+       freq = filtfilt(ones(1, inverse_sensitivity)/inverse_sensitivity, 1, abs(freq(1:ceil(end/2))));
+       diff_freq = (freq(3:end) - freq(1:end-2)) / 2;
+       second = 0;
+       for i = 2:numel(diff_freq)
+               if diff_freq(i - 1) >= 0 && diff_freq(i) <= 0
+                       if second == 0
+                               second = 1;
+                       else
+                               break
+                       end
+               end
+       end
+       if i == numel(diff_freq)
+               error('Could not find mark frequency!');
+       end
+       mark_freq = i;
+end
diff --git a/get_mark_indeces.m b/get_mark_indeces.m
new file mode 100644 (file)
index 0000000..7a91311
--- /dev/null
@@ -0,0 +1,15 @@
+function marks = get_mark_indeces(intensity)
+       mark_freq = get_mark_frequency(intensity);
+       half_window = floor(3 * mark_freq / 8);
+       [~, marks] = min(intensity(1:mark_freq));
+       while (marks(end) + mark_freq) < numel(intensity)
+               guess = marks(end) + mark_freq;
+               if (guess + half_window) < numel(intensity)
+                       [~, mark] = min(intensity(guess - half_window : guess + half_window));
+               else
+                       [~, mark] = min(intensity(guess - half_window : end));
+               end
+               mark = mark + guess - half_window - 1;
+               marks = [marks mark];
+       end
+end
diff --git a/get_meter.m b/get_meter.m
new file mode 100644 (file)
index 0000000..e6beebf
--- /dev/null
@@ -0,0 +1,20 @@
+function meter = get_meter(fig, mask, order)
+       if nargin < 3
+               order = 1;
+       end
+
+       meter_pic = get_meter_picture(fig, mask);
+       intensity = mean(meter_pic);
+       mark_indeces = get_mark_indeces(intensity);
+       coefs = polyfit(mark_indeces, 1:-0.1:1-(numel(mark_indeces)-1)*0.1, order);
+       meter = @(pix) polyval(coefs, pix);
+       %{
+       meter(mark_indeces)
+       figure
+       imshow(meter_pic);
+       hold on;
+       plot(mark_indeces, min(size(meter_pic))/2 * ones(size(mark_indeces)), 'mo');
+       hold off;
+       %}
+end
+
diff --git a/get_meter_picture.m b/get_meter_picture.m
new file mode 100644 (file)
index 0000000..874f2cb
--- /dev/null
@@ -0,0 +1,7 @@
+function meter_pic = get_meter_picture(fig, mask)
+       dark_vertical = mean(mask') < 0.3;
+       next0 = find(dark_vertical == 0, 1);
+       next1 = find(dark_vertical(next0:end) == 1, 1) + next0 - 1;
+       next0 = find(dark_vertical(next1:end) == 0, 1) + next1 - 1;
+       meter_pic = fig(next1:next0,:);
+end