Skip to content

Commit

Permalink
Use noise model for stacking, updated manual iso, added symmetric exp…
Browse files Browse the repository at this point in the history
…osure
  • Loading branch information
eszdman committed Sep 12, 2021
1 parent 5d7ec7a commit 9550807
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ GLTexture fusionMap(GLTexture in,GLTexture br,float str){
float[] intenseCurveY;
GLTexture interpolatedCurve;
boolean disableFusion = false;
boolean useSymmetricExposureFork = true;
@Override
public void Run() {
disableFusion = getTuning("DisableFusion",disableFusion);
Expand All @@ -144,6 +145,7 @@ public void Run() {
glProg.closed = true;
return;
}
useSymmetricExposureFork = getTuning("UseSymmetricExposureFork",useSymmetricExposureFork);
overExposeMpy = getTuning("OverExposeMpy", overExposeMpy);
overExposeMaxFusion = getTuning("OverExposeMaxFusion", overExposeMaxFusion);
underExposeMinFusion = getTuning("UnderExposeMinFusion", underExposeMinFusion);
Expand All @@ -169,11 +171,11 @@ public void Run() {
intenseCurveX[3] = 0.95f;
intenseCurveX[4] = 1.0f;

intenseCurveY[0] = 0.4f;
intenseCurveY[1] = 0.7f;
intenseCurveY[0] = 0.7f;
intenseCurveY[1] = 1.0f;
intenseCurveY[2] = 1.0f;
intenseCurveY[3] = 1.0f;
intenseCurveY[4] = 0.3f;
intenseCurveY[3] = 0.85f;
intenseCurveY[4] = 0.45f;
}

intenseCurveX = getTuning("IntenseCurveX", intenseCurveX);
Expand Down Expand Up @@ -214,13 +216,21 @@ public void Run() {
GLTexture downscaled = glUtils.interpolate(exposureBase,1.0/4.0);
getHistogram(downscaled);
downscaled.close();
float overexpose = autoExposureHigh()*overExposeMpy;
float overexposure = autoExposureHigh()*overExposeMpy;
float underexposure = autoExposureLow()*underExposeMpy;
//overexpose = Math.min(10.f,overexpose);
overexposure = Math.min(1024.f,overexposure);
underexposure = Math.max(1.f/1024.f,underexposure);

if(useSymmetricExposureFork){
float mpy = overexposure*underexposure;
overexposure/=mpy;
underexposure/=mpy;
}
//overexposure = Math.min(10.f,overexposure);
//underexposure = Math.max(underexposure,0.0008f);
Log.d(Name,"Overexp:"+overexpose+" , Underexp:"+underexposure);
Log.d(Name,"Overexp:"+overexposure+" , Underexp:"+underexposure);

GLUtils.Pyramid highExpo = glUtils.createPyramid(levelcount,downScalePerLevel, expose(in,overexpose));
GLUtils.Pyramid highExpo = glUtils.createPyramid(levelcount,downScalePerLevel, expose(in,overexposure));
GLUtils.Pyramid normalExpo = glUtils.createPyramid(levelcount,downScalePerLevel, expose2(in,underexposure));

//glUtils.convertVec4(highExpo.laplace[2],"in1.r");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,12 @@ private void ApplyHdrX() {
Log.d(TAG, "APPLY HDRX: buffer:" + mImageFramesToProcess.get(0).getPlanes()[0].getBuffer().asShortBuffer().remaining());
Log.d(TAG, "Api WhiteLevel:" + characteristics.get(CameraCharacteristics.SENSOR_INFO_WHITE_LEVEL));
Log.d(TAG, "Api BlackLevel:" + characteristics.get(CameraCharacteristics.SENSOR_BLACK_LEVEL_PATTERN));
PhotonCamera.getParameters().FillConstParameters(characteristics, new Point(width, height));
PhotonCamera.getParameters().FillDynamicParameters(captureResult);
PhotonCamera.getParameters().cameraRotation = cameraRotation;
Parameters processingParameters = PhotonCamera.getParameters();
processingParameters.FillConstParameters(characteristics, new Point(width, height));
processingParameters.FillDynamicParameters(captureResult);
processingParameters.cameraRotation = cameraRotation;

exifData.IMAGE_DESCRIPTION = PhotonCamera.getParameters().toString();
exifData.IMAGE_DESCRIPTION = processingParameters.toString();

Log.d(TAG, "Wrapper.init");
RawPipeline rawPipeline = new RawPipeline();
Expand Down Expand Up @@ -184,33 +185,44 @@ private void ApplyHdrX() {
// mpy = 1.f;
//if(images.get(i).pair.curlayer == IsoExpoSelector.ExpoPair.exposureLayer.Low) mpy = 1.f;
Log.d(TAG, "Load: i: " + i + " expo layer:" + images.get(i).pair.curlayer + " mpy:" + mpy);
Wrapper.loadFrame(images.get(i).buffer, ((FAKE_WL) / PhotonCamera.getParameters().whiteLevel) * mpy);
Wrapper.loadFrame(images.get(i).buffer, ((FAKE_WL) / processingParameters.whiteLevel) * mpy);
}
}
rawPipeline.imageObj = mImageFramesToProcess;
rawPipeline.images = images;
Log.d(TAG, "White Level:" + PhotonCamera.getParameters().whiteLevel);
Log.d(TAG, "White Level:" + processingParameters.whiteLevel);
Log.d(TAG, "Wrapper.loadFrame");
float denoiseLevel = (float) Math.sqrt((CaptureController.mCaptureResult.get(CaptureResult.SENSOR_SENSITIVITY)) * IsoExpoSelector.getMPY() - 40.)*6400.f / (6.2f*IsoExpoSelector.getISOAnalog());
Log.d(TAG, "Denoising level:" + denoiseLevel);
//float noiseLevel = (float) Math.sqrt((CaptureController.mCaptureResult.get(CaptureResult.SENSOR_SENSITIVITY)) *
// IsoExpoSelector.getMPY() - 40.)*6400.f / (6.2f*IsoExpoSelector.getISOAnalog());



ByteBuffer output = null;
Parameters parameters = PhotonCamera.getParameters();
InterpolateGainMap interpolateGainMap;
if (!debugAlignment) {
interpolateGainMap = new InterpolateGainMap(new Point(width, height));
interpolateGainMap.parameters = PhotonCamera.getParameters();
interpolateGainMap.parameters = processingParameters;
interpolateGainMap.Run();
interpolateGainMap.close();
Wrapper.loadInterpolatedGainMap(interpolateGainMap.Output);

output = Wrapper.processFrame(35*(0.6f+denoiseLevel)/2.f, 150*denoiseLevel, 512,0.f, 0.f, 0.f, parameters.whiteLevel
,parameters.whitePoint[0], parameters.whitePoint[1], parameters.whitePoint[2], parameters.cfaPattern);
float noiseLevel = (processingParameters.noiseModeler.computeModel[0].first.floatValue()+
processingParameters.noiseModeler.computeModel[1].first.floatValue()+
processingParameters.noiseModeler.computeModel[2].first.floatValue())*0.7f;
noiseLevel += processingParameters.noiseModeler.computeModel[0].second.floatValue()+
processingParameters.noiseModeler.computeModel[1].second.floatValue()+
processingParameters.noiseModeler.computeModel[2].second.floatValue();
noiseLevel*=Math.pow(2.0,19.0+PhotonCamera.getSettings().noiseRstr);
noiseLevel = Math.max(1.f,noiseLevel);
Log.d(TAG, "Denoising level:" + noiseLevel);
//TODO Write into java-created byteBuffer instead of jni
output = Wrapper.processFrame(1.0f*noiseLevel, 6.0f*noiseLevel, 1,0.f, 0.f, 0.f, processingParameters.whiteLevel
, processingParameters.whitePoint[0], processingParameters.whitePoint[1], processingParameters.whitePoint[2], processingParameters.cfaPattern);
} else {
rawPipeline.alignAlgorithm = alignAlgorithm;
output = rawPipeline.Run();
}
float[] oldBL = parameters.blackLevel.clone();
float[] oldBL = processingParameters.blackLevel.clone();

//Black shot fix
images.get(0).image.getPlanes()[0].getBuffer().position(0);
Expand Down Expand Up @@ -245,10 +257,10 @@ private void ApplyHdrX() {
Camera2ApiAutoFix.resetWL(characteristics, captureResult, patchWL);

processingEventsListener.notifyImageSavedStatus(imageSaved, dngFile);
parameters.blackLevel[0] = oldBL[0];
parameters.blackLevel[1] = oldBL[1];
parameters.blackLevel[2] = oldBL[2];
parameters.blackLevel[3] = oldBL[3];
processingParameters.blackLevel[0] = oldBL[0];
processingParameters.blackLevel[1] = oldBL[1];
processingParameters.blackLevel[2] = oldBL[2];
processingParameters.blackLevel[3] = oldBL[3];
Camera2ApiAutoFix.resetWL(characteristics, captureResult, (int) FAKE_WL);

/*parameters.blackLevel[0] = 0.f;
Expand Down
4 changes: 2 additions & 2 deletions app/version.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#Tue Sep 07 10:18:25 MSK 2021
VERSION_BUILD=12296
#Mon Sep 13 00:11:02 MSK 2021
VERSION_BUILD=12360
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.graphics.drawable.Drawable;
import android.hardware.camera2.CameraCharacteristics;
import android.os.Vibrator;
import android.util.Log;
import android.util.Range;

import com.particlesdevs.photoncamera.circularbarlib.R;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ protected void fillKnobInfoList() {
values.add((int) (val / IsoExpoSelector.getMPY(cameraCharacteristics)));
}
candidates.add(String.valueOf(isohigh));
values.add((int)isohigh);
values.add((int)((int)isohigh / IsoExpoSelector.getMPY(cameraCharacteristics)));
int indicatorCount = 0;
int tick = 0;
int preferredIntervalCount = 4;
Expand Down

0 comments on commit 9550807

Please sign in to comment.