Measure different sensor noise
*UPDATING IN PROGRESS*
Multiple captures are needed to evaluate dynamic noise. This script is being updated
Copyright Imageval Consulting, 2016
Contents
ieInit
Simple spatial resolution scene
scene = sceneCreate('slanted bar'); scene = sceneSet(scene,'fov',4); ieAddObject(scene); sceneWindow % Optical image oi = oiCreate; oi = oiCompute(oi,scene); ieAddObject(oi); oiWindow
ans =
sceneWindow_App with properties:
figure1: [1×1 Figure]
FileMenu: [1×1 Menu]
menuFileLoad: [1×1 Menu]
menuFileSave: [1×1 Menu]
menuSaveImage: [1×1 Menu]
menuFileRefresh: [1×1 Menu]
menuFileClose: [1×1 Menu]
menuEdit: [1×1 Menu]
menuEditSceneName: [1×1 Menu]
menuEditNewScene: [1×1 Menu]
menuCopyScene: [1×1 Menu]
menuEditDelete: [1×1 Menu]
menuEditDeleteSome: [1×1 Menu]
menuSpectral: [1×1 Menu]
menuSPDdiv: [1×1 Menu]
menuSPDMult: [1×1 Menu]
menuEditSetIlluminant: [1×1 Menu]
menuResampleWave: [1×1 Menu]
menuEditAdjustMonochrome: [1×1 Menu]
menuEditTransform: [1×1 Menu]
menuEditScaleSize: [1×1 Menu]
editCrop: [1×1 Menu]
menuEditTranspose: [1×1 Menu]
menuEditRotate: [1×1 Menu]
menuEditRotCW: [1×1 Menu]
menuEditRotCCW: [1×1 Menu]
menuEditFlip: [1×1 Menu]
menuEditFlipHorizontal: [1×1 Menu]
menuEditFlipVertical: [1×1 Menu]
menuEditFontSize: [1×1 Menu]
menuEditClearWindow: [1×1 Menu]
menuEditViewer: [1×1 Menu]
PlotMenu: [1×1 Menu]
menuPlotRadiance: [1×1 Menu]
menuPlotRadianceE: [1×1 Menu]
menuPlotRadImGrid: [1×1 Menu]
menuPlotIllumPhotons: [1×1 Menu]
menuPlotIlluminant: [1×1 Menu]
menuPlotIlluminantImage: [1×1 Menu]
menuPlotReflectance: [1×1 Menu]
menuPlotImTrueSize: [1×1 Menu]
menuPlotMultipleRGB: [1×1 Menu]
menuPlotImageSpectral: [1×1 Menu]
menuPlotDepth: [1×1 Menu]
menuPlotDepthContour: [1×1 Menu]
menuScene: [1×1 Menu]
menuSceneMacbeth: [1×1 Menu]
menuSceneMacbethTungsten: [1×1 Menu]
menuSceneMacbethD50: [1×1 Menu]
menuSceneMacbethD65: [1×1 Menu]
menuSceneMacbethC: [1×1 Menu]
menuSceneMacbethFluorescent: [1×1 Menu]
menuSceneMacbethVisIR: [1×1 Menu]
menuSceneLstar: [1×1 Menu]
menuScenesTest: [1×1 Menu]
menuScenesSweep: [1×1 Menu]
menuHarmonic: [1×1 Menu]
menuSceneFreqOrient: [1×1 Menu]
menuSceneSlantedBar: [1×1 Menu]
menuSceneZonePlate: [1×1 Menu]
menuSceneMackay: [1×1 Menu]
menuSceneCheckerboard: [1×1 Menu]
menuScenePointArray: [1×1 Menu]
menuSceneGridLines: [1×1 Menu]
menuSceneTestLine: [1×1 Menu]
menuSceneRadialLines: [1×1 Menu]
menuUniform: [1×1 Menu]
menuSceneUniformPhoton: [1×1 Menu]
menuSceneUniformEE: [1×1 Menu]
menuUniformD65: [1×1 Menu]
menuSceneUniformEESpecify: [1×1 Menu]
menuSceneUniformBBspecify: [1×1 Menu]
menuScenesRamp: [1×1 Menu]
menuSceneNoise: [1×1 Menu]
menuSceneFile: [1×1 Menu]
menuSceneMultiSpec: [1×1 Menu]
menuSceneChooseRGB: [1×1 Menu]
menuFileChooseFileMono: [1×1 Menu]
menuAn: [1×1 Menu]
menuAnalyzeLine: [1×1 Menu]
menuAnalyzeLineH: [1×1 Menu]
menuAnalyzeLineV: [1×1 Menu]
menuAnalyzeLFFTH: [1×1 Menu]
menuAnalyzeLFFTv: [1×1 Menu]
menuAnalyzeLineWave: [1×1 Menu]
menuAnalyzeLWH: [1×1 Menu]
menuAnalyzeLWV: [1×1 Menu]
menuAnalyzeROI: [1×1 Menu]
menuLuminance: [1×1 Menu]
menuAnalyzeChromaticity: [1×1 Menu]
menPlotLumLin: [1×1 Menu]
PlotLuminance: [1×1 Menu]
menuAnIlluminantCCT: [1×1 Menu]
menuHelp: [1×1 Menu]
menuHelpSceneProgrammers: [1×1 Menu]
menuHelpProgGuide: [1×1 Menu]
menuHelpAppNotes: [1×1 Menu]
UITable: [1×1 Table]
Panel: [1×1 Panel]
txtMessage: [1×1 Label]
Panel_2: [1×1 Panel]
popupRender: [1×1 DropDown]
text21: [1×1 Label]
txtDisplayGamma: [1×1 Label]
editGamma: [1×1 EditField]
btnPrev: [1×1 Button]
btnNext: [1×1 Button]
popupSelectScene: [1×1 DropDown]
sceneImage: [1×1 UIAxes]
MoreinfoButton: [1×1 Button]
boxDescription: [1×1 ButtonGroup]
txtSceneDescription: [1×1 Label]
boxScene: [1×1 ButtonGroup]
txtM: [1×1 Label]
txtDist: [1×1 Label]
editDistance: [1×1 EditField]
txtDeg: [1×1 Label]
txtFOV: [1×1 Label]
editHorFOV: [1×1 EditField]
txtCDM2: [1×1 Label]
txtLum: [1×1 Label]
editLuminance: [1×1 EditField]
imageMenu: [1×1 ContextMenu]
HorLumLineMenu: [1×1 Menu]
RefreshMenu: [1×1 Menu]
ans =
oiWindow_App with properties:
figure1: [1×1 Figure]
FileMenu: [1×1 Menu]
menuFileLoadOI: [1×1 Menu]
menuFileSaveOI: [1×1 Menu]
menuSaveImage: [1×1 Menu]
menuFileRefresh: [1×1 Menu]
menuFileClose: [1×1 Menu]
EditMenu: [1×1 Menu]
menuEditName: [1×1 Menu]
menuEditCreate: [1×1 Menu]
menuCopyOI: [1×1 Menu]
menuEditDelete: [1×1 Menu]
menuEditDeleteSome: [1×1 Menu]
menuEditScale: [1×1 Menu]
RemoveborderMenu: [1×1 Menu]
menuEditFontSize: [1×1 Menu]
menuEditClearMessage: [1×1 Menu]
menuEditViewer: [1×1 Menu]
PlotMenu: [1×1 Menu]
plotIrradiance: [1×1 Menu]
menuPlotIrradEnergy: [1×1 Menu]
menuPlotRGB: [1×1 Menu]
menuPlotImageGrid: [1×1 Menu]
menuPlotMultiRGB: [1×1 Menu]
menuPlotImageSpectral: [1×1 Menu]
menuPlotDepthmap: [1×1 Menu]
menuPlotDepthContour: [1×1 Menu]
menuOptics: [1×1 Menu]
menuStandForm: [1×1 Menu]
menuOpticsQuarterInch: [1×1 Menu]
menuOpticsThird: [1×1 Menu]
menuOpticsHalfInch: [1×1 Menu]
menuOpticsTwoThirds: [1×1 Menu]
menuOpticsInch: [1×1 Menu]
menuHuman: [1×1 Menu]
menuOpticsHuman: [1×1 Menu]
menuMacular: [1×1 Menu]
menuMacular028: [1×1 Menu]
menuOpticsRayTraceParam: [1×1 Menu]
menuOptTrans: [1×1 Menu]
menuOpticsRename: [1×1 Menu]
menuOpticsImport: [1×1 Menu]
menuOpticsExport: [1×1 Menu]
menuOpticsLoadSI: [1×1 Menu]
menuOpticsConvertCV: [1×1 Menu]
menuOpticsConvertZM: [1×1 Menu]
menuAn: [1×1 Menu]
menuPlOp: [1×1 Menu]
menuAnOpticsPSF: [1×1 Menu]
menuPlotPS550: [1×1 Menu]
menuAnPSFMovie: [1×1 Menu]
menuPlotLSWave: [1×1 Menu]
menuOTFAnyWave: [1×1 Menu]
plotOTF: [1×1 Menu]
menuPlOTFWave: [1×1 Menu]
menuAnOpImFieldAndWave: [1×1 Menu]
menuAnalyzeOptFieldD: [1×1 Menu]
menuAnOptSampling: [1×1 Menu]
menuPlotOffAxis: [1×1 Menu]
menuTransmittance: [1×1 Menu]
menuAnLineIllum: [1×1 Menu]
menuAnLineIllumHorizontal: [1×1 Menu]
menuAnLineIllumHorFFT: [1×1 Menu]
menuAnLineIllumVertical: [1×1 Menu]
menuAnLineIllumVertFFT: [1×1 Menu]
menuAnalyzeLinePlots: [1×1 Menu]
menuHline: [1×1 Menu]
menuVLine: [1×1 Menu]
menuPlotHLContrast: [1×1 Menu]
menuPlotVLContrast: [1×1 Menu]
menuROISummaries: [1×1 Menu]
menuPlotLuxHist: [1×1 Menu]
menuPlotCIE: [1×1 Menu]
menuPlotIllumLog: [1×1 Menu]
menuPlotIllumLin: [1×1 Menu]
menuFFTamp: [1×1 Menu]
menuHelp: [1×1 Menu]
menuHelpOIOnline: [1×1 Menu]
menuHelpOpticsOnline: [1×1 Menu]
menuHelpISETOnline: [1×1 Menu]
menuHelpAppNotes: [1×1 Menu]
OpticssettingsPanel: [1×1 Panel]
popDiffuser: [1×1 DropDown]
txtDiffuser: [1×1 Label]
txtBlurSD: [1×1 Label]
editDiffuserBlur: [1×1 EditField]
Cos4thSwitch: [1×1 Switch]
Cos4thSwitchLabel: [1×1 Label]
btnSimulate: [1×1 Button]
txtFnumber: [1×1 Label]
popOpticsModel: [1×1 DropDown]
editFnumber: [1×1 EditField]
txtFocalLength: [1×1 Label]
editFocalLength: [1×1 EditField]
UITable: [1×1 Table]
btnNext: [1×1 Button]
btnPrev: [1×1 Button]
popupRender: [1×1 DropDown]
pulldownSelectOI: [1×1 DropDown]
text32: [1×1 Label]
txtMessage: [1×1 Label]
txtDisplayGamma: [1×1 Label]
editGamma: [1×1 EditField]
oiImage: [1×1 UIAxes]
Set the sensor noise properties
% Set up the sensor for a noise free calculation sensor = sensorCreate; sensor = sensorSet(sensor,'exp time',0.050); sensor = sensorSet(sensor,'noise flag',0); sensorNF = sensorCompute(sensor,oi); v = sensorGet(sensorNF,'volts'); ieAddObject(sensorNF); sensorWindow % sensorNF = vcGetObject('sensor');
ans =
sensorWindow_App with properties:
figure1: [1×1 Figure]
menuFile: [1×1 Menu]
menuFileLoad: [1×1 Menu]
menuSensorImport: [1×1 Menu]
menuFileLoadVoltsMat: [1×1 Menu]
menuFileSave: [1×1 Menu]
menuSensorExport: [1×1 Menu]
menuFileSaveVoltsMat: [1×1 Menu]
menuSaveImage: [1×1 Menu]
menuFileSpecsheet: [1×1 Menu]
menuFileResh: [1×1 Menu]
menuFileClose: [1×1 Menu]
menuEdit: [1×1 Menu]
menuEditName: [1×1 Menu]
menuEditCreate: [1×1 Menu]
menuCopySensor: [1×1 Menu]
menuEditDelete: [1×1 Menu]
editDeleteSome: [1×1 Menu]
editCropMenu: [1×1 Menu]
menuEditResampleWave: [1×1 Menu]
sensorEditClearData: [1×1 Menu]
menuEditFontSize: [1×1 Menu]
menuEditViewer: [1×1 Menu]
LoadSaveSensorMenu: [1×1 Menu]
menuPlot: [1×1 Menu]
menuImDSNU: [1×1 Menu]
menuImPRNU: [1×1 Menu]
menuImShotNoise: [1×1 Menu]
menuPlotSpectra: [1×1 Menu]
menuPlotColorFilters: [1×1 Menu]
menuPlotIR: [1×1 Menu]
plotSpecCFApattern: [1×1 Menu]
menuPlotPDSpectralQE: [1×1 Menu]
menuPlotSpecResp: [1×1 Menu]
menuPlotPixelSR: [1×1 Menu]
menuPlotSensorImageTSize: [1×1 Menu]
plotMccOverlay: [1×1 Menu]
menuPlotHumanCone: [1×1 Menu]
menuSensor: [1×1 Menu]
LoadMenu: [1×1 Menu]
CFAMenu: [1×1 Menu]
ColorfiltersMenu: [1×1 Menu]
PhotodetectorQEMenu: [1×1 Menu]
IRfilterMenu: [1×1 Menu]
menuPDSize: [1×1 Menu]
menuSensorMicrolens: [1×1 Menu]
menuDesignCFA: [1×1 Menu]
menuSensorHumanCones: [1×1 Menu]
humanCones631: [1×1 Menu]
humanConesKLMS1631: [1×1 Menu]
menuSensorCDS: [1×1 Menu]
menuSensorColFPN: [1×1 Menu]
menuSensorPixelVignetting: [1×1 Menu]
menuSensorSetComputeGrid: [1×1 Menu]
menuAnalyze: [1×1 Menu]
LinesMenu: [1×1 Menu]
menuHorizontal: [1×1 Menu]
menuHorLineVolts: [1×1 Menu]
menuHorLineE: [1×1 Menu]
menuHorLineDV: [1×1 Menu]
menuVertical: [1×1 Menu]
menuAnLineV: [1×1 Menu]
menuVertLineE: [1×1 Menu]
menuVertLineDV: [1×1 Menu]
TwoLinesMenu: [1×1 Menu]
HorizontalMenu: [1×1 Menu]
VoltsMenu: [1×1 Menu]
ElectronsMenu: [1×1 Menu]
DigitalcountMenu: [1×1 Menu]
VerticalMenu: [1×1 Menu]
VoltsMenu_2: [1×1 Menu]
ElectronsMenu_2: [1×1 Menu]
DigitalcountMenu_2: [1×1 Menu]
menuAnROIStats: [1×1 Menu]
menuAnBasic: [1×1 Menu]
menuAnBasicE: [1×1 Menu]
MeanSDdvMenu: [1×1 Menu]
menuAnHistogramVolts: [1×1 Menu]
menuAnPixHistQ: [1×1 Menu]
HistogramdvMenu: [1×1 Menu]
menuAnPO: [1×1 Menu]
menuAnalyzePOVignetting: [1×1 Menu]
menuAnalyzeMicroLens: [1×1 Menu]
menuAnPixOptLoadUL: [1×1 Menu]
menuAnPixOptSaveUl: [1×1 Menu]
menuAnPOShowUL: [1×1 Menu]
menuAnSNR: [1×1 Menu]
menuAnPixelSNR: [1×1 Menu]
menuAnSensorSNR: [1×1 Menu]
menuPixelLuxSec: [1×1 Menu]
menuSensorLuxSec: [1×1 Menu]
menuISOSat: [1×1 Menu]
menuAnExposureValue: [1×1 Menu]
menuAnPhotExp: [1×1 Menu]
menuAnColor: [1×1 Menu]
menuAnColorRB: [1×1 Menu]
menuAnColorRG: [1×1 Menu]
CCManalysisMenu: [1×1 Menu]
menuAnComputeFromScene: [1×1 Menu]
menuHelp: [1×1 Menu]
menuHelpSensorOnline: [1×1 Menu]
menuHelpPixelOnline: [1×1 Menu]
menuHelpISETOnlineManual: [1×1 Menu]
menuAppNotes: [1×1 Menu]
SensorPanel: [1×1 Panel]
ResizeDropDown: [1×1 DropDown]
ResizeDropDownLabel: [1×1 Label]
sensorTable: [1×1 Table]
btnComputeImage: [1×1 Button]
popQuantization: [1×1 DropDown]
popISA: [1×1 DropDown]
txtMVperSec: [1×1 Label]
txtPRNU: [1×1 Label]
text25: [1×1 Label]
txtFPN: [1×1 Label]
editGainFPN: [1×1 EditField]
editOffsetFPN: [1×1 EditField]
txtRow: [1×1 Label]
editISAcols: [1×1 EditField]
editISARows: [1×1 EditField]
ExposurePanel: [1×1 Panel]
AutoESwitch: [1×1 Switch]
AutoESwitchLabel: [1×1 Label]
popupExpMode: [1×1 DropDown]
editExpFactor: [1×1 EditField]
editNExposures: [1×1 EditField]
txtExposureUnits: [1×1 Label]
editExpTime: [1×1 EditField]
btnShowCFAExpDurations: [1×1 Button]
PixelPanel: [1×1 Panel]
txtReadNoise_2: [1×1 Label]
pixelTable: [1×1 Table]
text21: [1×1 Label]
text20: [1×1 Label]
text19: [1×1 Label]
txtDkCurrent: [1×1 Label]
text12: [1×1 Label]
editVoltageSwing: [1×1 EditField]
editConvGain: [1×1 EditField]
txtConvGain: [1×1 Label]
txtDarkCurrent: [1×1 Label]
editDarkCurrent: [1×1 EditField]
txtReadNoise: [1×1 Label]
editReadNoise: [1×1 EditField]
Panel: [1×1 Panel]
txtBracketExposure: [1×1 Label]
Panel_2: [1×1 Panel]
imageCFA: [1×1 Image]
sliderSelectBracketedExposure: [1×1 Slider]
MaxbrightSwitch: [1×1 Switch]
MaxbrightSwitchLabel: [1×1 Label]
GammaEditField: [1×1 EditField]
GammaEditFieldLabel: [1×1 Label]
txtMessage: [1×1 Label]
btnPrev: [1×1 Button]
btnNext: [1×1 Button]
popupSelect: [1×1 DropDown]
imgMain: [1×1 UIAxes]
Property: []
Now compute with all noise terms on
nSamp = 100; voltImages = sensorComputeSamples(sensorNF,nSamp);
Warning: Needs updating Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model Warning: Must be updated for new noise model
Look at the noise histogram across all images
noiseImages = voltImages - repmat(v,[1 1 nSamp]); ieNewGraphWin; histogram(noiseImages(:),100)
s = std(voltImages,0,3); ieNewGraphWin; imagesc(s); colorbar
meanImage = mean(voltImages,3); plot(meanImage(:),v(:),'.') grid on; axis equal
s1 = sensorCompute(sensor,oi); s2 = sensorCompute(sensor,oi); v1 = sensorGet(s1,'volts'); v2 = sensorGet(s2,'volts'); histogram(v1(:) - v2(:),100)