Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

reflectometer

This repository contains 3D printable components and software for in-situ measurement of Radiance material reflectance properties. Details are described in Nathaniel L. Jones, Arusha Nirvan, and Christoph Reinhart (2023), Low-Cost Photographic Measurement of Colour, Specular Reflectance, and Roughness.

Building the Enclosure

To build the enclosure, manufacture the STL files included in the stl directory using a 3D printer. Print light_enclosure.stl with white material and the others with black material. The camera_attachement.stl piece is sized for a Canon RF 14-35mm f/4 IS USM lens and may be altered to fit other lenses.

Wire LEDs, 3V watch batteries, and a switch into the light enclosure. Affix a light diffuser such as white printer paper to the aperture in the light_attachement.stl piece. Cover the insides of the black enclosure pieces with black flock paper to reduce their reflectance.

With the LEDs on, take an HDR photograph of the interior of the box in a room without any other light sources. Use Photosphere or similar software to obtain the red, green, and blue radiance values of the diffuser.

Obtaining HDR images of materials

Place a camera against the camera_attachement.stl piece such that it is looking into the enclosure. Tape all seams including around the edge of the camera lens to prevent light leaks.

Place the cross-shaped slot of the enclosure base against a flat piece of the material to be measured. With the LEDs switched on and shinging through the diffuser into the enclosure, take a series of exposures of the sample seen through the enclosure (use autobracketing).

Using Photosphere or similar software, convert the image set to an HDR image. Use the same response file that was used to obtain the image of the diffuser. It is recommended to downsample the image to 512 pixels wide.

Creating the reference images

In the shell directory, run make_reference_image.sh to generate the reference images. The script takes the following arguments:

ArgumentMeaning
-pGenerate reference images for Radiance plastic model (default)
-aGenerate reference images for Ashikhmin-Shirly model
-sGenerate reference image for horizontal slot (default)
-tGenerate reference image for vertical slot
-f fileSpecify the Radiance scene to use (defaults to blackbox.rad)
-x resolutionSpecify the image resolution (defaults to 512)
-vh angleSpecify the horizontal angle of the image in degrees (defaults to 85.431961)

Calculating the Radiance parameters

Place the HDR images of all samples to be measured into a directory. In a Python environment, import reflectometer.py from the python directory and run the following command, which returns output in a DataFrame:

reflectometer.run(hdr_directory, result_directory, ref_u_path, ref_v_path, diffuser_radiance, sample_count, save_figures, ashik, verbose_errors)

ParameterTypeMeaning
hdr_directorystringPath to the directory of input HDR images.
result_directorystring, optionalPath to the directory where output should be saved, or None if output should not be saved. If the directory does not exist, it will be created. The default is None.
ref_u_pathstring, optionalPath to the horizontal reference image, or None if calculations should not be performed. The default is None.
ref_v_pathstring, optionalPath to the vertical reference image, or None if the material is isotropic. This input is required for the Ashikhmin-Shirley model. The default is None.
diffuser_radiancearray-like of numbers, optionalRed, Green, and Blue color channel multipliers, which are the observed radiance of the diffuser in each color channel. The default is [0.118384, 0.109451, 0.121427].
sample_countinteger, optionalIf a non-zero value is given, the run will stop after that number of images have been processed. The default is 0.
save_figuresboolean, optionalFlag to save images generated during the run to the result_directory, if one is given. The default is False.
ashikboolean, optionalFlag to use Ashikhmin-Shirley model. The default is True.
verbose_errorsboolean, optionalFlag to print detailed error messages. The default is False.

About

3D printable components and software for in-situ measurement of Radiance material reflectance properties

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages