public ImageDescription blendImages(List <ImageDescription> images) { int newSizeX, newSizeY; List <ImageDescription> imagesToBlend; ImageDescriptionUtil.makeAllImagesSameSize(images, out newSizeX, out newSizeY, out imagesToBlend); ImageDescription output = new ImageDescription(); output.sizeX = newSizeX; output.sizeY = newSizeY; output.grayscale = true; float blendFactor = 1.0f / images.Count(); byte[,] outputGray = new byte[newSizeY, newSizeX]; for (int i = 0; i < newSizeY; i++) { for (int j = 0; j < newSizeX; j++) { float sum = 0; for (int imageIndex = 0; imageIndex < images.Count; imageIndex++) { sum += imagesToBlend[imageIndex].gray[i, j]; } sum *= blendFactor; outputGray[i, j] = (byte)(sum + 0.5f); } } output.gray = outputGray; return(output); }
public float train(List <ImageDescription> inputImages, ImageDescription inputImageGroundTruth) { int newSizeX, newSizeY; List <ImageDescription> imagesToBlend; ImageDescriptionUtil.makeAllImagesSameSize(inputImages, out newSizeX, out newSizeY, out imagesToBlend); float entropyLoss = 0; for (int i = 0; i < newSizeY; i++) { for (int j = 0; j < newSizeX; j++) { float stretchedProbability = computePerPixelStretchedProbability(imagesToBlend, i, j); float probability = LogisticHelper.squash(stretchedProbability); if (probability < LogisticHelper.probabilityMinValue) { probability = LogisticHelper.probabilityMinValue; } else { if (probability > LogisticHelper.probabilityMaxValue) { probability = LogisticHelper.probabilityMaxValue; } } float groundTruthProbability = groundTruthProbabilityCache[inputImageGroundTruth.gray[i, j]]; entropyLoss += LogisticHelper.computeEntropyLoss(probability, groundTruthProbability); #if useEntropyLoss float loss = groundTruthProbability - probability; #else float loss = (groundTruthProbability - probability) * probability * (1 - probability); #endif for (int imageIndex = 0; imageIndex < imagesToBlend.Count; imageIndex++) { byte pixelValue = imagesToBlend[imageIndex].gray[i, j]; weights[imageIndex] += learningConstant * stretchedPixelValueCache[pixelValue] * loss; } } } return(entropyLoss); }
public ImageDescription blendImages(List <ImageDescription> images) { int newSizeX, newSizeY; List <ImageDescription> imagesToBlend; ImageDescriptionUtil.makeAllImagesSameSize(images, out newSizeX, out newSizeY, out imagesToBlend); ImageDescription output = new ImageDescription(); output.sizeX = newSizeX; output.sizeY = newSizeY; output.grayscale = true; byte[,] outputGray = new byte[newSizeY, newSizeX]; for (int i = 0; i < newSizeY; i++) { for (int j = 0; j < newSizeX; j++) { float stretchedProbability = computePerPixelStretchedProbability(imagesToBlend, i, j); float probability = LogisticHelper.squash(stretchedProbability); if (probability < LogisticHelper.probabilityMinValue) { probability = LogisticHelper.probabilityMinValue; } else { if (probability > LogisticHelper.probabilityMaxValue) { probability = LogisticHelper.probabilityMaxValue; } } outputGray[i, j] = (byte)(probability * 255.0f + 0.5f); } } output.gray = outputGray; return(output); }