From 8b7daf2cfa700451c1ae6b898cd4b24358c10d5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Luk=C3=A1=C5=A1=20Ji=C5=99i=C5=A1t=C4=9B?= Date: Mon, 19 Aug 2024 17:09:00 +0200 Subject: [PATCH] Implement get_meter function 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 | 2 ++ get_mark_frequency.m | 23 +++++++++++++++++++++++ get_mark_indeces.m | 15 +++++++++++++++ get_meter.m | 20 ++++++++++++++++++++ get_meter_picture.m | 7 +++++++ 5 files changed, 67 insertions(+) create mode 100644 get_mark_frequency.m create mode 100644 get_mark_indeces.m create mode 100644 get_meter.m create mode 100644 get_meter_picture.m diff --git a/Bubliny.m b/Bubliny.m index a2f26fa..89cb88a 100755 --- a/Bubliny.m +++ b/Bubliny.m @@ -115,5 +115,7 @@ for iii=1:nSelectedDirectory % Cycles for directories with files imshow(meanfig .* uint8(mask)); figure plot(mean(double(meanfig), Weights = mask)); + + meter = get_meter(maxfig, mask); end % iii, Cycles for directories with files diff --git a/get_mark_frequency.m b/get_mark_frequency.m new file mode 100644 index 0000000..2f67b2a --- /dev/null +++ b/get_mark_frequency.m @@ -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 index 0000000..7a91311 --- /dev/null +++ b/get_mark_indeces.m @@ -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 index 0000000..e6beebf --- /dev/null +++ b/get_meter.m @@ -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 index 0000000..874f2cb --- /dev/null +++ b/get_meter_picture.m @@ -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 -- 2.30.2