function plot_dr(cam, isos, calib, dr, dr_tweak) tweaked_isos = isos .* (2 .^ (calib / 100)) clf, hold on # how DR would change with ideal linear amplification that doesn't introduce noise? for i = 1:length(isos) plot([isos(i)/2, isos(i)*2], [dr(i)+1, dr(i)-1], 'color', [0.9 0.9 0.9]) end semilogx(tweaked_isos, dr_tweak, '-or;ML ISO;', 'linewidth', 2, isos, dr, '-o;Canon ISO;', 'linewidth', 2); set(gca,'xtick', isos) set(gca,'xticklabel', isos) grid on xlabel('ISO'); ylabel('Dynamic range (EV)'); title(cam); axis([50 25600 7 12]); offsets = [10 20 80 150 400 1000 2500 5000]; prev_tweaked_iso = 0; for i = 1:length(isos) text(isos(i)-offsets(i), dr(i), sprintf("\nISO %d", isos(i)), 'horizontalalignment','center', 'color', 'blue'); if tweaked_isos(i) > prev_tweaked_iso*1.1, text(tweaked_isos(i)+offsets(i), dr_tweak(i)+0.12, sprintf("ISO %d", round(tweaked_isos(i))), 'horizontalalignment','center', 'color', 'red'); end prev_tweaked_iso = tweaked_isos(i); end plot(isos(1)*2, dr(1)-1, 'o', 'linewidth', 2, 'color', [0.7 0.7 0.7]); text(isos(1)/1.8, dr(1)-1-0.2,"\_{ISO 100 pushed by 1 EV}\n_{(linear, with clipping)}", 'color', [0.7 0.7 0.7]) set(fill([isos(1)/1.9 isos(1)*3 isos(1)*3 isos(1)/1.9], [dr(1)-1-0.1 dr(1)-1-0.1 dr(1)-1-0.6 dr(1)-1-0.6], 'white'),'edgecolor','white') end # 5D2 isos = [ 100 200 400 800 1600 3200 ]; calib = [-31 -28 -28 -22 -16 -116 ]; dr = [ 11.383 11.372 11.241 11.011 10.520 9.515 ]; dr_tweak = [ 11.705 11.637 11.516 11.224 10.683 10.675 ]; plot_dr('5D Mark II, 1/30, manual lens', isos, calib, dr, dr_tweak); print -dpng -r90 5d2.png # new tweak dr_cmos = [ 11.920 11.806 11.658 11.300 10.713 10.701 ]; plot_dr('5D Mark II, 1/30, manual lens', isos, calib, dr, dr_cmos); semilogx(isos .* (2 .^ (calib / 100)), dr_tweak, "og;Without CMOS tweak;", 'linewidth', 2); print -dpng -r90 5d2-cmos.png # 5D3 isos = [ 100 200 400 800 1600 3200 6400 12800 ]; calib = [-37 -41 -43 -43 -44 -49 -55, -58 ]; dr = [ 10.989 10.928 10.799 10.594 10.153 9.521 8.584 7.778 ]; dr_tweak = [ 11.371 11.334 11.239 11.028 10.598 10.017 9.131 8.360 ]; plot_dr('5D Mark III, 1/30, manual lens', isos, calib, dr, dr_tweak); # intermediate ISOs estimated with iso_regs.mo isos160 = [ 188 376 752 1501 3000 6005 11990 ]; dr160 = [ 11.012 10.887 10.681 10.237 9.612 8.665 7.878 ]; semilogx(isos160, dr160, '-og;Canon ISO 160x;', 'linewidth', 2); text(160, 11.13, 'ISO 160', 'horizontalalignment','center', 'color', 'green'); isos125 = [ 126 252 504 1008 2013 4024 8056 ]; dr125 = [ 10.659 10.603 10.462 10.248 9.815 9.187 8.249 ]; semilogx(isos125, dr125, '-oc;Canon ISO 125x;', 'linewidth', 2); text(125, 10.5, 'ISO 125', 'horizontalalignment','center', 'color', 'cyan'); # tricky call to work around octave bugs... need to upgrade? set(fill([2500 24000 24000 2500], [10.4 10.4 11.1 11.1], 'white'),'edgecolor','white') text(24000,11,"\_{Note: intermediate ISOs}\n\_{estimated with iso\\_regs.mo}\n\_{(ISO 160 clips like ML ISO 188)}", 'backgroundcolor', 'red', 'horizontalalignment','right'); print -dpng -r90 5d3.png # new tweak dr_cmos = [ 11.467 11.420 11.313 11.075 10.628 10.032 9.134 8.363 ]; plot_dr('5D Mark III, 1/30, manual lens', isos, calib, dr, dr_cmos); semilogx(isos .* (2 .^ (calib / 100)), dr_tweak, "og;Without CMOS tweak;", 'linewidth', 2); print -dpng -r90 5d3-cmos.png # 60D isos = [ 100 200 400 800 1600 3200 ]; calib = [-18 -33 -36 -33 -34 -34 ]; dr = [ 10.91 10.72 10.55 9.99 9.10 8.24 ]; dr_tweak = dr - calib / 100; plot_dr('60D, Canon DR from DxO, ML DR not measured (theoretical values)', isos, calib, dr, dr_tweak); print -dpng -r90 60d.png # 550D isos = [ 100 200 400 800 1600 3200]; calib = [-34 -41 -44 -44 -47 -51 ]; dr = [ 10.95 10.92 10.59 10.08 9.17 8.44]; dr_tweak = dr - calib / 100; plot_dr('550D, Canon DR from DxO, ML DR not measured (theoretical values)', isos, calib, dr, dr_tweak); print -dpng -r90 550d.png # 6D isos = [ 100 200 400 800 1600 3200 6400 12800]; calib = [-37 -34 -39 -41 -43 -52 -56 -156 ]; dr = [ 11.43 11.39 11.22 10.87 10.44 9.76 8.94 7.97 ]; dr_tweak = dr - calib / 100; plot_dr('6D, Canon DR from DxO, ML DR not measured (theoretical values)', isos, calib, dr, dr_tweak); print -dpng -r90 6d.png # 700D isos = [ 100 200 400 800 1600 3200]; calib = [-41 -43 -44 -40 -47 -51 ]; dr = [ 10.62 10.47 10.21 9.63 8.88 8.04]; dr_tweak = dr - calib / 100; plot_dr('700D, Canon DR from DxO, ML DR not measured (theoretical values)', isos, calib, dr, dr_tweak); print -dpng -r90 700d.png # 650D isos = [ 100 200 400 800 1600 3200]; calib = [-37 -43 -43 -40 -48 -51 ]; dr = [ 10.62 10.47 10.21 9.63 8.88 8.04]; dr_tweak = dr - calib / 100; plot_dr('650D, Canon DR from DxO, ML DR not measured (theoretical values)', isos, calib, dr, dr_tweak); print -dpng -r90 650d.png # 50D, measured by ayshih # https://docs.google.com/spreadsheet/ccc?key=0Aqd_Zo2KQfZHdHBsVE5KZ3VsY3Vsd3FBVW1CeUtmSFE&usp=sharing#gid=0 isos = [ 100 200 400 800 1600 3200 6400 ]; calib = [-31 -18 -18 -17 -15 -113 -213 ]; dr = [ 11.067 11.212 10.856 10.253 9.497 8.482 7.539]; dr_tweak = [ 11.339 11.332 10.976 10.460 9.675 9.655 9.655 ]; plot_dr('50D, f4, 1/10 ISO 100, 1/20 ISO 200 and so on', isos, calib, dr, dr_tweak); hold on; # intermediate ISOs: most of them have the same DFE gain # ISO 2500 has lower DFE gain; assumming it's linear, the real ISO is: iso2500 = 3200 * mean([0x65b 0x666 0x661 0x660]) / mean([0x802 0x810 0x80a 0x808]); isos160 = [ 200 400 800 1600 iso2500]; dr160 = [ 11.191 10.838 10.232 9.512 8.848]; semilogx(isos160, dr160, '-og;Canon ISO 160x;', 'linewidth', 2); text(220, 11.3, 'ISO 160', 'color', 'green'); isos125 = [ 125 250 500 1000 2000]; dr125 = [ 10.767 10.863 10.509 9.931 9.175]; semilogx(isos125, dr125, '-oc;Canon ISO 125x;', 'linewidth', 2); text(125, 10.5, 'ISO 125', 'horizontalalignment','center', 'color', 'cyan'); hold off; print -dpng -r90 50d.png