eoyilmaz / displaycal-py3

DisplayCAL Modernization Project
https://eoyilmaz.github.io/displaycal-py3/
GNU General Public License v3.0
850 stars 60 forks source link

Precision Drift Prevention #319

Open oldgithubman opened 9 months ago

oldgithubman commented 9 months ago

Edit - the proposed method is one possible implementation. I haven't finalized my approach yet. Suggestions are welcome.

I've never filed an issue before, so forgive me if I'm doing this wrong. I'd like to implement a drift prevention method:

Let's assume a user has a display he wants to profile. It has the following characteristics: When cold, its peak luminance is 1,100 nits and color temperarure is 6,000K daylight. When hot, its peak luminance is 900 nits and color temperature is 7,000K daylight. When warm, its peak luminance is 1,000 nits and color temperature is 6,504K daylight (D65). These readings are reliably consistent.

I'm proposing a method to compensate the drift while profiling as follows: Start with the display cool and reading > 1,000 nits. Start profiling. Profiling software displays white patch and reads continuously until reading = 1,000 nits. Display 50% grey patch and save reading as reference. Display first patch from patch set and record as usual. Display 50% grey patch, compare to previously saved reference. If currentY < referenceY, display less-luminous patch from patch set next. If none exist, insert black patch for a time, then display white patch and continuously read until 1,000 nits. Continue as usual. If currentY > referenceY, display more-luminous patch next. If none exist, display white patch and continuously read until 1,000 nits. Continue as usual. Continue until done. Log all readings for user verification of process behavior. All variables should be user-configurable.

Initially, I think it'd probably be easier to implement a more-simplified version where, instead of displaying variable patches from the patch set, we just display black or white as needed

eoyilmaz commented 8 months ago

We already have black and white level drift compenstation supplied by ArgyllCMS' dispread, and it is kind of working as you explained. From ArgyllCMS dispread documentation for the -Ib and -Iw flags:

The -I b|w options invoke instrument black level, and display white level compensation (respectively). Instrument black level drift compensation attempts to combat instrument black calibration drift by using a display black test patch as a reference. If an instrument is not acclimatised sufficiently to the measurement conditions, changes in temperature can affect the black readings. Display white level drift compensation attempts to combat changes in display brightness as it warms up by measuring a white patch every so often, and using it to normalise all the other readings. If just instrument black drift compensation is needed, use -Ib. If just display white level compensation is needed, use -Iw. If both are needed, use -Ibw or -Iwb.

The only missing part is that it is not waiting for a certain luminance level to start the initial measurement, and from what I understand from the documentation (because I never used drift compenstation) you don't need that as it normalizes the readings throught the reading process.

oldgithubman commented 8 months ago

What I'm proposing is not argyll's drift compensation, which does not work for modern displays (HDR, OLED, etc.). I'm very familiar with argyll's drift compensation. For HDR, you do need to wait for a certain luminance level (your target peak luminance) to start the initial measurement. It has nothing to do with normalizing readings. You can find a detailed discussion on the argyll mailing list