После декодирования и кодирования изображения с помощью тензорного резкого изображения новое изображение становится черным, что отличается от оригинала.Я не знаю в чем проблема? - PullRequest
0 голосов
/ 03 мая 2019

Когда я декодирую изображение .jpeg в тензор с помощью tenorflowsharp, а затем кодирую тензор в Jpeg, новое изображение .jpeg изменяется на черный, что отличается от исходного изображения. в чем проблема?

Я пробовал много картинок и разных способов декодировать и кодировать эти картинки, но проблема всегда возникала.

код для декодирования изображения в тензор, как показано ниже:

private static void ConstructGraphToNormalizeImage(out TFGraph graph, out TFOutput input, out TFOutput output, TFDataType destinationDataType = TFDataType.Float)
{
    int W = 288;
    int H = 288;
    float Scale = 1;
    graph = new TFGraph();
    input = graph.Placeholder(TFDataType.String);

    output = graph.Cast(graph.Div(
            x: graph.ResizeBilinear(
                images: graph.ExpandDims(
                    input: graph.Cast(
                        graph.DecodeJpeg(contents: input, channels: 3), DstT: TFDataType.Float),
                    dim: graph.Const(0, "make_batch")),
                size: graph.Const(new int[] { W, H }, "size")),     
        y: graph.Const(Scale, "scale")), destinationDataType);
}

public static TFTensor CreateTensor(TFTensor tensor, TFDataType destinationDataType = TFDataType.Float)
{
    TFGraph graph;
    TFOutput images, output;

    ConstructGraphToNormalizeImage(out graph, out images, out output, destinationDataType);

    using (var session = new TFSession(graph))
    {
        var normalized = session.Run(
                    inputs: new[] { images },
                    inputValues: new[] { tensor },
                    outputs: new[] { output });
        return normalized[0];
    }
}

код для кодирования тензора к изображению, как показано ниже:

private byte[] TensorToJpeg(TFTensor image)
        {
            var graph = new TFGraph();
            var input = graph.Placeholder(TFDataType.Float);
            var output = graph.Squeeze(input, new long[] {0}, "Squeeze_dimens");

            output = graph.Cast(output, TFDataType.UInt8);

            output = graph.EncodeJpeg(output);  

            using (var session = new TFSession(graph))
            {
                var result = session.Run(
                    inputs: new[] { input },
                    inputValues: new[] { image },
                    outputs: new[] { output });
                var tensor = result[0];

                byte[] buffer = new byte[(int)tensor.TensorByteSize-10];
            System.Runtime.InteropServices.Marshal.Copy(tensor.Data+10, buffer, 0, buffer.Length);
                return buffer;
            }   
        }

var contents = File.ReadAllBytes(ImagePath); 

var tensor = TFTensor.CreateString(contents);

TFTensor tensorNormalized = CreateTensor(tensor);           

byte[] NewImage_Bytes = TensorToJpeg(tensorNormalized); 

File.WriteAllBytes(SendPathName+"Newimage.jpeg", NewImage_Bytes); 

обычно новое изображение должно совпадать с исходным, если я не нормализую его. но даже изображение нормализовано, я думаю, что новое изображение не должно быть черным.

...