diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index bdf91db..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore index 1e1e42f..dd0b59f 100644 --- a/.gitignore +++ b/.gitignore @@ -163,4 +163,32 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ \ No newline at end of file +#.idea/ + + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk \ No newline at end of file diff --git a/01-0001-cropped-transformed-ratio.png b/01-0001-cropped-transformed-ratio.png index ab2c38f..e8a6214 100644 Binary files a/01-0001-cropped-transformed-ratio.png and b/01-0001-cropped-transformed-ratio.png differ diff --git a/display_key.html b/display_key.html new file mode 100644 index 0000000..7d29f47 --- /dev/null +++ b/display_key.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + +
ColorTemperature
700°C
800°C
900°C
1000°C
+ + diff --git a/ratio_pyrometry.py b/ratio_pyrometry.py index 9ec27a3..72369be 100644 --- a/ratio_pyrometry.py +++ b/ratio_pyrometry.py @@ -2,25 +2,35 @@ import math import cv2 as cv import numpy as np from numba import jit +import json # camera settings file = '01-0001.png' I_Darkcurrent = 150.5 -exposure_time = 0.5 +exposure_time = 0.500 f_stop = 2.4 ISO = 64 # basically brightness -# runtime config -MAX_GR_RATIO = 2000 -MIN_GR_RATIO = None +# pyrometry config +MAX_GR_RATIO = 1200 +MIN_GR_RATIO = 0 +# original range from paper +# MAX_GR_RATIO = 1200 +# MIN_GR_RATIO = 600 +# Cropping config x1 = 420 x2 = 1200 y1 = 400 y2 = -1 +# post-processing +smoothing_radius = 2 + @jit(nopython=True) def rg_ratio_normalize(imgarr): + tmin = MAX_GR_RATIO + tmax = 0 imgnew = imgarr for i in range(len(imgarr)): for j in range(len(imgarr[i])): @@ -29,21 +39,36 @@ def rg_ratio_normalize(imgarr): g_norm = normalization_func(px[1]) # apply camera calibration func - ratio = pyrometry_calibration_formula(g_norm, r_norm) + temp_C = pyrometry_calibration_formula(g_norm, r_norm) - # remove edge cases - if MAX_GR_RATIO != None and ratio > MAX_GR_RATIO or MIN_GR_RATIO != None and ratio < MIN_GR_RATIO: - ratio = 0 + # remove pixels outside calibration range + if MAX_GR_RATIO != None and temp_C > MAX_GR_RATIO or MIN_GR_RATIO != None and temp_C < MIN_GR_RATIO: + temp_C = 0 + + # update min & max + if temp_C < tmin and temp_C >= 0: + tmin = temp_C + if temp_C > tmax: + tmax = temp_C + + imgnew[i][j] = [temp_C, temp_C, temp_C] + return imgnew, tmin, tmax - imgnew[i][j] = [ratio, ratio, ratio] - return imgnew @jit(nopython=True) def normalization_func(i): + """ + does something to the pixels that i don't understand lol + """ return (i - I_Darkcurrent) * (f_stop ** 2) / (ISO * exposure_time) + @jit(nopython=True) def pyrometry_calibration_formula(i_ng, i_nr): + """ + Given the green-red ratio, calculates an approximate temperature + in Celsius. + """ return 362.73 * math.log10( (i_ng/i_nr) ** 3 ) + 2186.7 * math.log10( @@ -52,6 +77,7 @@ def pyrometry_calibration_formula(i_ng, i_nr): (i_ng / i_nr) ** 3 ) + 3753.5 + # read image & crop file_name = file.split(".")[0] file_ext = file.split(".")[1] @@ -61,29 +87,17 @@ cv.imwrite(f'{file_name}-cropped.{file_ext}', img) # img = cv.imread('ember_test.png') -img = rg_ratio_normalize(img) +img, tmin, tmax = rg_ratio_normalize(img) -# apply smoothing conv kernel -kernel = np.array([ - [1/2, 1/2], - [1/2, 1/2], -]) +print(f"min: {tmin}°C") +print(f"max: {tmax}°C") -# kernel = np.array([ -# [1/3, 1/3, 1/3], -# [1/3, 1/3, 1/3], -# [1/3, 1/3, 1/3], -# ]) - -# kernel = np.array([ -# [1/4, 1/4, 1/4, 1/4], -# [1/4, 1/4, 1/4, 1/4], -# [1/4, 1/4, 1/4, 1/4], -# [1/4, 1/4, 1/4, 1/4], -# ]) - -# Scaling adjustment factor -kernel *= 3/5 +# build & apply smoothing conv kernel +k = [] +for i in range(smoothing_radius): + k.append([1/(smoothing_radius**2) for i in range(smoothing_radius)]) + # for j in range(smoothing_radius): +kernel = np.array(k) img = cv.filter2D(src=img, ddepth=-1, kernel=kernel) diff --git a/ratio_pyrometry_legend.py b/ratio_pyrometry_legend.py new file mode 100644 index 0000000..908621c --- /dev/null +++ b/ratio_pyrometry_legend.py @@ -0,0 +1,7 @@ +import ratio_pyrometry + +@jit(nopython=True) +def normalization_func_customizable(i, I_Darkcurrent, ISO, f_stop, exposure_time): + return (i - I_Darkcurrent) * (f_stop ** 2) / (ISO * exposure_time) + +