{"id":47839912,"url":"https://github.com/monocle-h2020/camera_calibration","last_synced_at":"2026-04-03T20:36:48.309Z","repository":{"id":47964633,"uuid":"136810839","full_name":"monocle-h2020/camera_calibration","owner":"monocle-h2020","description":"Spectral and radiometric calibration of consumer cameras (SPECTACLE).","archived":false,"fork":false,"pushed_at":"2025-07-10T22:20:45.000Z","size":161441,"stargazers_count":35,"open_issues_count":0,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-08-26T20:58:02.736Z","etag":null,"topics":["camera","camera-calibration","citizen-science","python","smartphone-sensor-data","spectacle"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/monocle-h2020.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-06-10T13:23:15.000Z","updated_at":"2025-07-10T22:02:07.000Z","dependencies_parsed_at":"2023-12-25T01:27:34.916Z","dependency_job_id":"174dd338-f9de-4334-b92e-3285ad0a9e61","html_url":"https://github.com/monocle-h2020/camera_calibration","commit_stats":{"total_commits":1270,"total_committers":2,"mean_commits":635.0,"dds":0.06062992125984257,"last_synced_commit":"e7cb4277597c7bcc6c08012e3406603b37085a6d"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/monocle-h2020/camera_calibration","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monocle-h2020%2Fcamera_calibration","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monocle-h2020%2Fcamera_calibration/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monocle-h2020%2Fcamera_calibration/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monocle-h2020%2Fcamera_calibration/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/monocle-h2020","download_url":"https://codeload.github.com/monocle-h2020/camera_calibration/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monocle-h2020%2Fcamera_calibration/sbom","scorecard":{"id":658760,"data":{"date":"2025-08-11","repo":{"name":"github.com/monocle-h2020/camera_calibration","commit":"be7ca3c58e8d58a4f7f21b456518a3f41a2cf7da"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-21T15:27:53.544Z","repository_id":47964633,"created_at":"2025-08-21T15:27:53.544Z","updated_at":"2025-08-21T15:27:53.544Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31375772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T17:53:18.093Z","status":"ssl_error","status_checked_at":"2026-04-03T17:53:17.617Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["camera","camera-calibration","citizen-science","python","smartphone-sensor-data","spectacle"],"created_at":"2026-04-03T20:36:47.626Z","updated_at":"2026-04-03T20:36:48.300Z","avatar_url":"https://github.com/monocle-h2020.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SPECTACLE\n\nSPECTACLE (Standardised Photographic Equipment Calibration Technique And CataLoguE) is a standardised methodology for the spectral and radiometric calibration of consumer camera data.\nMore information on the SPECTACLE methodology, including results from applying it to several cameras, can be found in our paper: https://doi.org/10.1364/OE.27.019075.\nA real-world application using two smartphone cameras for above-water radiometry can be found in https://doi.org/10.3389/frsen.2022.940096.\n\nThe camera calibration data described in the paper are available from [this link.](https://drive.google.com/drive/folders/1acKQBolfL1gsyeGRGuOHT8UDONjBTdhU?usp=sharing)\n\nThis repository contains the associated `spectacle` Python module.\nThis module can be used to calibrate data using previously obtained calibration data (measured by the user or retrieved from the SPECTACLE database).\nIt also includes functions and pre-made scripts for processing calibration data, as described in the paper linked above.\n\n# Installation\n\nCurrently, the easiest way to install the `spectacle` module is using `pip`: simply run `pip install pyspectacle` in your terminal to fetch the package from PyPI and install it.\n\nYou may have to specify a user-specific installation (`pip install pyspectacle --user`) if a permission error occurs.\nPlease note that while the module is identified as `pyspectacle` on PyPI and in pip, in Python itself it is imported and used as simply `spectacle`.\n\nAn alternative way to install the `spectacle` module is to clone this repository (`git clone git@github.com:monocle-h2020/camera_calibration.git`) and then install it using pip, by navigating into the repository folder and running `pip install .` (mind the `.`).\n\n# Usage\n\nThere are three main use cases for the `spectacle` module, each of which will be explained further in the relevant subsection.\nThey are as follows:\n\n1. Application: applying camera calibrations to new data.\n2. Analysis: analysing camera properties and performance based on calibration data.\n3. Calibration: generating calibration data for use in the two other use cases.\n\n## Application\n\nCalibrations are applied to existing data using the `spectacle.Camera` interface.\nIn short, a Python object is created that represents a camera (for example the iPhone SE or Nikon D5300) and holds all the relevant information.\nThis object has methods (functions, subroutines) corresponding to the different calibrations that can be done.\nWhen called, these methods automatically retrieve the appropriate calibration data.\nEach method comes with detailed documentation on its usage, which can be found in the individual scripts or from within Python (using Python's `help` function or iPython's `?` and `??` shortcuts).\n\nA camera information file is generated using the [generate_camera.py](calibration/generate_camera.py) script.\nThis camera information file can be loaded in any script using the `spectacle.load_camera` function, which takes one argument, namely the `root` folder that contains all calibration data for a certain camera.\n\nFor example, if your calibration data for an iPhone SE are stored in the folder `/home/spectacle_data/iPhone_SE/`, then that folder is the `root` folder and the camera information file should be located in that folder (i.e. at `/home/spectacle_data/iPhone_SE/metadata.json`).\nThen the Camera object can be initialised from that file and used in the future.\n\nCalibrations are applied using the Camera object's methods, such as `Camera.correct_bias` for correcting for camera bias.\nThe Camera object will automatically load the required calibration data from the same folder it was initialised from.\n\nUsing the example of the iPhone SE, one might run the following piece of code:\n```python3\nfrom spectacle import load_camera, io\n\ncamera = load_camera(\"/home/spectacle_data/iPhone_SE/\")\nraw_data = io.load_raw_image(\"/home/img_0001.dng\")\n\ndata_corrected = camera.correct_bias(raw_data)\n```\nThis code snippet loads the iPhone SE camera data and a RAW image file (`/home/img_0001.dng`), then corrects the RAW image data for the iPhone SE camera bias.\n\n\n## Analysis\n\nA large number of pre-made scripts for the analysis of camera data, calibration data, and metadata are provided in the [analysis](analysis) subfolder.\nThese are sorted by the parameter they probe, such as linearity or dark current.\nPlease refer to the README in the [analysis](analysis) subfolder and documentation in the scripts themselves for further information.\nA number of common methods for analysing these data have also been bundled into the [`spectacle.analyse`](spectacle/analyse.py) submodule.\n\n## Calibration\n\nFinally, pre-made scripts for generating calibration data based on data gathered by the user are provided in the [calibration](calibration) subfolder.\nThese are sorted by the parameter they probe, such as bias or flat-field response.\nFurthermore, a script is provided that combines calibration data generated this way into a format that can be uploaded to the [SPECTACLE database](http://spectacle.ddq.nl/).\nPlease refer to the README in the [calibration](calibration) subfolder and documentation in the scripts themselves for further information.\n\n# Further information\n\nThe SPECTACLE method itself has been fully developed and applied, as shown in [our paper](https://doi.org/10.1364/OE.27.019075).\nThe [SPECTACLE database](http://spectacle.ddq.nl/) and `spectacle` Python module are still in active development.\nContributions from the community are highly welcome and we invite everyone to contribute.\n\nFurther information will be added to this repository with time.\nIf anything is missing, please [raise an issue](https://github.com/monocle-h2020/camera_calibration/issues) or [contact the authors directly](mailto:burggraaff@strw.leidenuniv.nl).\n\n_This project has received funding from the European Union's Horizon 2020 research and innovation programme under grant agreement No 776480 (MONOCLE)._\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonocle-h2020%2Fcamera_calibration","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonocle-h2020%2Fcamera_calibration","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonocle-h2020%2Fcamera_calibration/lists"}