Add auto-alignment for HDR bracket merging - #21420
Conversation
|
Are the settings in preferences pretty much set and forget (don't need to be messed with) or useful to be able to adjust without having to go to preferences? I created an HDR, then adjusted the settings and tried to create another HDR using the same images as the previous. The second HDR overwrote the first HDR. Probably should use the on conflict naming. EDIT: In my very quick test, the images looked fine. No alignment errors were observed. |
I believe some of them might be removed after more testing, or we remove them from the GUI and keep them as expert settings in dartablerc only.
This behaviour exists since day 1 of the HDR merge feature and is not scope of this PR. I plan to improving the HDR merge feature after this PR, as I discovered a lot of bad behaviours with the actual HDR merge functionality. I want to make it closer to the hdrmerge algorithm, which - by the way - was also recently adopted in vkdt. It prevents ghosting much better as the naive merge algorithm in darktable.
Perfect! Can you try some really challenging handheld exposure brackets? |
At that time there was only 1 possible output. This PR introduces settings, making multiple outputs possible. Since settings are available, users will try and tune the HDR output to find the best settings. You could probably steal the conflict code from the exporter or just do a simple test if the file exists and then append
Everything I have can be aligned by simple x y alignments. |
a5a803c to
938a8f3
Compare
I prefer to do this in another PR, I don't want to change too many things at a time. EDIT: Okay, the more I think about this the more sense it makes, especially for testing the feature with the ability to create multiple new HDR DNG files with different settings will be much easier with that filename numbering schema. If we settle on a specific set of parameter values, we can also remove this again. |
|
FYI: I did not test the auto-alignment with X-Trans (Fuji) RAW files. It would be great if anybody could cover this case or provide exposure brackets for testing. Thanks! |
b88115d to
927c845
Compare
ce8aa64 to
1193c60
Compare
Implements automatic image registration in the lighttable merge HDR
path so handheld/tripod brackets can be merged without ghosting, via OpenCV.
Key pieces:
- src/common/hdr_alignment.{h,c}: pure-C layer — CFA luma proxy
build, percentile normalisation, proxy→full-res homography rescale,
CFA-aware same-color warp (Bayer exact, X-Trans approx),
reliability/sanity gate, per-frame orchestration
- src/common/hdr_alignment_cv.cc: OpenCV C++ backend — SIFT detect,
FLANN kNN + Lowe ratio + mutual-NN, spatial keypoint balancing
(5000-each), findHomography RANSAC, affine fallback, cluster-
degradation to translation-only, spatial match subsampling
- control_jobs.c: wire alignment state into dt_control_merge_hdr_t;
set_reference on first frame, align_frame on each subsequent frame
- Optional USE_OPENCV CMake flag (default ON); without OpenCV the
feature compiles to a no-op and the merge is unchanged
- Support OpenCV 4 and 5: 5.x renamed features2d to features and split
calib3d into calib/geometry/stereo, so the CMake probe tries both
module layouts and the C++ seam selects headers via CV_VERSION_MAJOR
(Homebrew now ships 5.0.0)
- Seven runtime prefs in darktableconfig.xml.in (auto_align,
auto_reference, proxy_scale, feature_gamma, clahe_clip,
sift_keypoints, debug_images)
- DT_DEBUG_HDR_MERGE channel (-d hdr_merge), debug image dump
- cmocka unit tests: synthetic homography round-trip + probe ranking
- CI/CD: add OpenCV per-module packages to Dockerfile, Brewfile,
ci.yml, nightly.yml; README + Windows packaging docs updated
- Create a new image with a numeric suffix instead of overwriting existing one
- Validate image selection before starting HDR merge
Tests:
- test_hdr_alignment: CFA-modulated Bayer alignment test (per-channel gains, so
a colour-blind warp would introduce crosstalk) — the headline property.
- test_hdr_alignment_internal: X-Trans same-colour isolation test exercising the
border fallback (sampling colour c only ever reads colour-c photosites).
1193c60 to
8f502e6
Compare
|
In case anybody is on macOS and frequently stacks hands-free exposure brackets, please give this PR a shot. Pre-built AppImages are mentioned in the PR description and instructions how to install the new dependency (OpenCV) for all relevant operation systems are provided. |
|
Hello @da-phil, I would really like to test your PR (on linux). The appimages at the place you mentionned seems to be expired, where do I need to go to download your PR ? |
Thanks for the hint, I just kicked off an artifact build 2 days ago and they're already expired... |
|
I think I need to temporarily update the |
| path: ${{ github.workspace }}/src/build/Darktable-*.AppImage* | ||
| name: artifact-appimage-${{ runner.arch }} | ||
| retention-days: 1 | ||
| retention-days: 21 |
There was a problem hiding this comment.
Remove before merge!
| path: ${{ env.BUILD_DIR }}/*.exe | ||
| name: artifact-windows-${{ runner.arch }} | ||
| retention-days: 1 | ||
| retention-days: 21 |
There was a problem hiding this comment.
Remove before merge!
| path: ${{ env.INSTALL_PREFIX }}/darktable-${{ env.VERSION }}-${{ env.ARCHITECTURE }}.dmg | ||
| name: artifact-macos-${{ runner.arch }} | ||
| retention-days: 1 | ||
| retention-days: 21 |
There was a problem hiding this comment.
Remove before merge!
|
I changed the retention time to 21 days and did another artifact build here: |
|
Thanks ! I've tested the merge with some of my pictures (shot on Sony A7II) without messing with the default settings, it works really well. The only time I encountered a problem was because one of the photo was blurry to begin with, so nothing to report. Thank you a lot for the work. I'd be happy to test further if you make other changes. One thing I could point out is to have the settings for the merge in a popup window when clicking on the merge button, or alternatively another button "HDR settings" just next to the "Create HDR" one. Would be less cluttered than having it amongst all the other settings |
Cool, thanks for your feedback! How many images did you merge at once and how long did the merge take rougly?
Hmmm, this would be a breaking change in our UX/UI in such a case. If HDR merge would be a separate "operation group" in the lighttable UI, I think this would make sense, but not in the current design where HDR merge functionality is provided by a mere action button within the "actions on selection" group. |
|
I merged 3 exposures at 2 stops intervals and it took roughly 6 seconds to process.
I see, then I'd prefer to have it as a separate tab (as you'd see it if you use the lua script HDRmerge) rather than in global settings. I agree that having a single button for HDR amongst other actions is quite bizarre. |
The scope of this PR is to replace the existing functionality with an aligned version while leaving the UI unchanged. If a more extensive UI is needed for HDR merging I would suggest that it be a separate PR rather than having this PR start feature creeping. |
Just tested on X-Trans. Looking good so far. Not challenging, three-shot handheld brackets kept as steady as possible, up to 85mm equiv focal, but they won't merge correctly in stock darktable. I can provide RAF files but can't attach them here. |
I'm not sure I understand you correctly. Did you mean to say that while stock darktable was not able to merge the images correctly, darktable with the changes in this PR was able to deliver a good HDR merge result (which I really hope 😄)? |
I believe this is pretty good for the hardware you listed below! So I think that performance seems not to be a bottleneck.
Yeah, let's talk about UI changes after this PR was merged, but you're right, the current solution isn't great and was mainly provided for debugging reasons while this PR is open. I'm not even sure if I want to keep the settings eventually, as long as the default settings work well enough for every possible use-case. |
Correct, while approximately aligned they are not pixel-level aligned and had to be aligned in an external program. |
|
@da-phil : I don't have images to test this feature as I have never done HDR :) Do you have some images to share for testing purpose? Otherwise I'll take some in the coming days. TIA. |
|
BTW, sounds like a very nice feature. |
All images I have tested so far are part of my portfolio, so I'm hesitant to share them, I need to look if I can find some handheld exposure bracket test shots which I can share... |
|
@TurboGit I can share some of my shots for testing if you want. Tell me how you want me to send them to you |
|
@OuraN2O : Send me a link from any upload service to pascal@obry.net. TIA. |
TurboGit
left a comment
There was a problem hiding this comment.
I had not all the OpenCV lib installed the auto-alignment was OFF (the HDR had ghosting images) but I still had the HDR alignment options in the preferences. Should not be there if the support is not active.
|
After installing the libraries it works fine on my side. |
Implements automatic image registration in the lighttable merge HDR path so handheld/tripod brackets can be merged without ghosting, via OpenCV.
Auto-alignment processing steps:
estimateAffine2Dis tried as a fallback. If inliers cluster into ≤ 2 grid cells the model is further degraded to a pure translation to avoid wild extrapolation.A more detailed design overview can be found here:
https://github.com/da-phil/darktable/blob/a5a803c5447894faa208a9507a5c82e5fb38e260/dev-doc/HDR_Alignment_Design.md
Key changes
App images can be found here:
https://github.com/da-phil/darktable/actions/runs/31011476951#artifacts
If you want to build yourself, you need install the OpenCV ≥ 4.4 (or 5.x) lib first (no opencv_contrib needed):
brew install opencvsudo apt install libopencv-core-dev libopencv-imgproc-dev libopencv-features2d-dev libopencv-flann-dev libopencv-calib3d-devsudo dnf install opencv-develsudo pacman -S opencvsudo zypper install opencv-develsudo apk add opencv-devpacman -S mingw-w64-ucrt-x86_64-opencvDisclaimer: this work has been co-created with Claude.
Fixes: #17326