Night mode on any camera. Based on HDR+.

Overview

Burst Photo

This is a macOS app written in Swift / SwiftUI / Metal that implements a simplified version of HDR+, the computational photography pipeline in Google Pixel phones. You can read more about HDR+ in Google's paper Burst photography for high dynamic range and low-light imaging on mobile cameras.

If you are a researcher or you prefer Python/PyTorch, I suggest you check out hdr-plus-pytorch.

Example

I took a burst of 35 images at ISO 12,800 on Sony RX100-V and boosted it by +2EV. Here's a comparison of a single image from the burst vs. a merge of all the images.

alt text

To test motion-robustness, I compared a raw image, output from the app using Robustness set to High, and output from the app using Robustness set to Low. You can compare my results to Google's by opening Figure 6 in their paper. Image taken from Google's HDR+ dataset licensed under CC BY-SA.

alt text

For more examples, please visit burst.photo/gallery/.

Usage

To process a burst of DNG images, simply drag-and-drop them into the app. You can read more at burst.photo/help/.

alt text

Download

You can download the app from the Mac App Store or as a GitHub release.

Features

  • DNG support
  • robust merge
  • mutli-threaded image loading
  • align+merge running in pure Metal

TODO

  • Fix progressbar getting stuck loading the first image
  • ARM support – requires recompiling Adobe DNG SDK
  • 32-bit output - how can this be achieved in Adobe DNG SDK?
  • super-resolution

Please feel free to contribute to any of these features or suggest other features.

Acknowledgements

This product includes DNG technology under license by Adobe.

Comments
  • [Feature Request] Automatically convert non-DNG raws to DNG

    [Feature Request] Automatically convert non-DNG raws to DNG

    Instead of having the user manually convert to DNG before running the app. It would be really convenient if the user could simply drag in non-DNG raw files and the app convert them to DNG and them process those DNGs.

    opened by Alex-Vasile 9
  • Automatically Convert non-DNG raws to DNG

    Automatically Convert non-DNG raws to DNG

    I'm gotten part of the way there, but there' a few swift related things that I can't quite figure out.

    • [x] The CLI call can't find the files
    • [ ] The setting screen needs to have a file picker for selecting the location of the Converter
    • [ ] The current default path is hard-coded in. It should probably be blank by default, and have a function run on startup to check the default install location, but I am not sure where to put that.
    • [x] The user should be prompted if the path isn't set and a non-DNG file is found

    Closes #4

    opened by Alex-Vasile 3
  • Allow for uppercase file extensions

    Allow for uppercase file extensions

    Noticed that I was unable to process a file with an uppercase extension despite it being a DNG. Once I changed it to ".dng" it worked as expected.

    opened by tslouf-umich 2
  • Seg Fault when merging iPhone 13 ProRaw Files

    Seg Fault when merging iPhone 13 ProRaw Files

    To test things out I shot some ProRaw files with my iPhone 13 pro. I let it enable it automatic night mode. The resulting raw files (3 of them) that I shot sequentially I transfer to my Mac. When I drag them into Burst Photo the app immediately crashes. If I launch it from the terminal to try to get some better info into what's going on all I am told is "segmentation fault". This is with the version 1.1 (14). The version I have in #6 does not crash.

    opened by Alex-Vasile 2
  • Apple ProRaw support

    Apple ProRaw support

    Unfortunately, Apple ProRaw photos taken with the iPhone 14 Pro don't work. I tried converting them with Adobe DNG Converter, but the result is the same: Unsupported Format

    opened by bmatthias 7
  • Added merging in the frequency domain, improved alignment of tiles.

    Added merging in the frequency domain, improved alignment of tiles.

    Automatic selection of merging approach:

    • merging in frequency domain if Bayer pattern detected
    • merging in spatial domain (current approach) in all other cases

    Merging in frequency domain:

    • merging in frequency domain leads to slightly better details at comparable noise reduction, especially in high-contrast structures
    • blending of 4 executions of pipeline with raised cosine window
    • motion map that locally controls strength of temporal denoising

    Merging in spatial domain (=> current approach)

    • replacement of box filter for blurring with binomial filter, which is the better choice for image blurring
    • bug fix in this filter that removes a color shift in the image (box filter was shifted due to wrong selection of indices)

    Improvement of alignment (both merging approaches):

    • application of slight binomial blurring before generation of gaussian pyramid
    • check of three candidate motion vectors after upsampling to correct potential issues at transitions (as proposed in the original publication)
    • padding of original image that all downsampling levels are a multiple of tile size and nearest neighbor upsampling does not skip rows or columns
    • improvement of computation time for search distance 2

    Other improvements:

    • improved compatibility of output DNG with inclusion of maker notes (e.g. required for lens sharpness in DxO Photolab)
    • added robustness parameter in filename, e.g. "x_merged_6.dng", that users can fine-tune the robustness parameters for their individual image without manually renaming the image
    opened by chris-rank 0
  • [Feature request] Add global pre-alignment of burst images

    [Feature request] Add global pre-alignment of burst images

    I would suggest to add a global pre-alignment step before the tile-based alignment starts. The tile-based alignment could then be initialized with the values of the global pre-alignment. Depending on the focal length chosen, the effect of handshake can be quite different. For wide angle, it is small. However, for tele-photo lenses it is much larger. The global pre-alignment would ensure that the starting point of the tile-based alignment would be much more consistent.

    opened by chris-rank 2
  • [Feature request] Merging of images in the frequency domain

    [Feature request] Merging of images in the frequency domain

    I would suggest to perform the merging of tiles in the frequency domain as suggested in the original paper. I already have a working function for this task implemented in your app. However, it requires some additional functionality that I have not yet implemented. First initial results already show a better image quality than the current implementation. One disadvantage of my current implementation is that it would only work with Bayer patterns. As the Fourier transformation is a little bit tricky, extension to generic patterns is a lot of work. Furthermore, the 2x2 pattern can be computed using SIMD instructions in Metal, which increases performance quite a bit. I would be more than happy to contribute here.

    opened by chris-rank 2
  • [Feature request] Detect sharpest image in the burst and use it as the reference image

    [Feature request] Detect sharpest image in the burst and use it as the reference image

    Instead of choosing the mid image in the burst as reference image, I would suggest to use the sharpest image as the reference image instead. As all images in the burst are very similar (except noise and motion), I believe that application of simple methods would work for detection of the sharpest image. I already started implementing this functionality, but have not yet figured out how to transfer back the float value (return value) of your mean_average() function into Swift. If you can help with this little task, I would be more than happy to contribute (provided that my function works well in the end).

    opened by chris-rank 0
Releases(v1.2)
Owner
Martin Marek
Martin Marek
An open collection of tools and experiments for rendering wide-gamut scene-linear data into an image for an SDR or HDR display device.

Open Display Transform An open collection of tools and experiments for rendering wide-gamut scene-linear data into an image for an SDR or HDR display

Jed Smith 127 Dec 29, 2022
Friday Night Funkin' on the original PlayStation

Friday Night Funkin' on the original PlayStation

CuckyDev 169 Dec 18, 2022
TinyTouchLight - Dimmable USB Night Light with Capacitive Touch Control

TinyTouchLight - Dimmable USB Night Light with Capacitive Touch Control

Stefan Wagner 11 Dec 30, 2022
If the button pressed esp will reset and App mode will on. App mode will on then led will on, network is connected led will off.

DHT22-to-Google-sheet-Reset-Using-ESP8266-LED-Switch If button pressed esp will reset and App mode will on. App mode will on then led will on, network

Md. Harun-Or-Rashid 3 Aug 17, 2022
Automatically load dlls into any executables without replacing any files!

Automatically loaded dll using xinput9_1_0 proxy. Please put the modified xinput9_1_0.dll in the executable's directory.

null 14 Dec 24, 2022
Create a calculator of any kind in any language, create a pr.

calculators Create a calculator of any kind in any language, create a pr. Create a calculator of any type using the programming language of your choic

Akshay Gautam 2 Oct 21, 2022
A Gazebo based LiDAR-Camera Data Simulator.

Livox-LiDAR-Camera System Simulator A package to provide plug-in for Livox Series LiDAR. This work is inherited from EpsAvlc and LvFengchi's work: liv

zhijianglu 14 Jan 5, 2023
This repository is used for automatic calibration between high resolution LiDAR and camera in targetless scenes.

livox_camera_calib livox_camera_calib is a robust, high accuracy extrinsic calibration tool between high resolution LiDAR (e.g. Livox) and camera in t

HKU-Mars-Lab 491 Dec 29, 2022
Some sketches for the VL53L5CX ranging camera for use with the Arduino IDE

VL53L5CX Some examples for the ST's VL53L5CX 8 x 8 pixel ranging camera using Simon Levy's Arduino library and Seth Bonn's multi-byte I2C read and wri

Kris Winer 18 Dec 8, 2022
calibrate a Livox LiDAR and a camera

Livox LiDAR-Camera Calibration This method is from the official method of Livox(https://github.com/Livox-SDK/livox_camera_lidar_calibration) It's just

null 10 Nov 24, 2022
A simple utility for loading custom firmware onto the PS5 camera, using libusb.

A simple utility for loading custom firmware onto the PS5 camera, using libusb.

Raleigh Littles 21 Nov 10, 2022
Jetson Nano camera driver extracted from the jetbot_ros package.

Jetson Cam Jetson Nano camera driver extracted from the jetbot_ros package. Dependencies System Dependencies GStreamer Typically preinstalled in jetso

H S Helson Go 2 Nov 12, 2021
A FLOSS implementation of the ground breaking MacBook camera system for GNU/Linux

GNU/Notch Tired of your friends making fun of your dinosaur laptop? Can't afford anything but Free Software? Fret not for this simple X11 based progra

null 3 Jun 1, 2022
My DIY 3 Axis Camera Slider Project

3Axis Camera Slider My DIY 3 Axis Camera Slider Project Authors NEWTech-Creative * Myles Newton GitHub YouTube Original project inspiration from * Raj

NEWTech Creative 11 Dec 1, 2022
JeVois-Pro People Counter : Implement people counter on JeVois-Pro Deep Learning Smart Camera

JeVois-Pro People Counter Refer to the OpenCV People Counter article to implement a people counter on the JeVois-Pro Deep Learning Smart Camera. First

On-Device AI Co., Ltd. 1 Nov 10, 2021
This repository uses a ROS node to subscribe to camera (hikvision) and lidar (livox) data. After the node merges the data, it publishes the colored point cloud and displays it in rviz.

fusion-lidar-camera-ROS 一、介绍 本仓库是一个ROS工作空间,其中ws_fusion_camera/src有一个工具包color_pc ws_fusion_camera │ README.md │ └───src │ └───package: c

hongyu wang 23 Dec 7, 2022
This package estimates the calibration parameters that transforms the camera frame (parent) into the lidar frame (child)

Camera-LiDAR Calibration This package estimates the calibration parameters that transforms the camera frame (parent) into the lidar frame (child). We

Australian Centre for Field Robotics 219 Jan 4, 2023
A generic and robust calibration toolbox for multi-camera systems

MC-Calib Toolbox described in the paper "MultiCamCalib: A Generic Calibration Toolbox for Multi-Camera Systems". Installation Requirements: Ceres, Boo

null 204 Jan 5, 2023