Warum sieht mein Ausgabebild auf onnxruntime-node im Vergleich zur Python-Laufzeit onnxruntime rötlich aus?Python

Python-Programme
Guest
 Warum sieht mein Ausgabebild auf onnxruntime-node im Vergleich zur Python-Laufzeit onnxruntime rötlich aus?

Post by Guest »

Ich portiere einen Python-Code nach NodeJS, aber das Ausgabebild sieht rötlich aus.
Ich möchte opencv nicht in NodeJS verwenden. Ich verwende scharf. Haben Sie eine Idee, wie Sie das Problem beheben können?
Das Eingabebild ist ein Schwarzweißbild für Python- und NodeJS-Code. Das Ausgabebild sollte farbig sein. Der Code wandelt also Schwarzweiß in Farbe um. Es verwendet das ONNX-Modell. Allerdings liefert Python das erwartete Ergebnis, aber im Fall von NodeJS liefert es eine rötliche Ausgabe.
Ich habe unten zwei Bilder angehängt, Ausgaben von NodeJS bzw. Python. Python eins war korrekt, aber nicht nodejs
Dies ist nodejs-Code

Code: Select all

const sharp = require('sharp');

// Convert image to tensor data
const imageToTensor = async (imageBuffer, rFactor) => {
// const img = new Image();
// img.src = imageBuffer;

const imageSharp = sharp(imageBuffer); // Create a sharp instance
// Get metadata (includes width and height)
const metadata = await imageSharp.metadata();

// Get original dimensions and LAB values
const originalLab = await imageSharp.toColorspace('lab').raw().toBuffer();

// First convert to grayscale using sharp for better preprocessing
const grayscaleBuffer = await imageSharp
.grayscale()
.resize(rFactor, rFactor, {
fit: 'fill',
kernel: 'lanczos3', // Use better quality resizing
})
.raw()
.toBuffer();

// Prepare tensor data with proper normalization
const tensorData = new Float32Array(3 * rFactor * rFactor);
for (let i = 0; i < grayscaleBuffer.length; i++) {
// Normalize to 0-1 range
const normalizedValue = grayscaleBuffer[i] / 255.0;

// Fill all three channels with the same normalized value
tensorData[i] = normalizedValue;
tensorData[i + rFactor * rFactor] = normalizedValue;
tensorData[i + 2 * rFactor * rFactor] = normalizedValue;
}

return {
originalLab,
tensorData,
dimensions: { width: metadata.width, height: metadata.height },
};
};

//colorizedData is output from onnx model

async function colorizeImage(inputImageBuffer, colorizedData, dimensions) {
try {
// Convert original image to LAB to extract L channel
const originalLab = await sharp(inputImageBuffer)
.toColorspace('lab')
.raw()
.toBuffer();

// Create buffer for final image
const finalImageBuffer = Buffer.alloc(
dimensions.width * dimensions.height * 3
);

// 3. Combine channels:
// - Use L (luminance) from original image
// - Use a,b (color) channels from colorized result
for (let i = 0; i < dimensions.width * dimensions.height; i++) {
const idx = i * 3;

// Copy L channel from original image
finalImageBuffer[idx] = originalLab[idx];

// Copy a,b channels from colorized result, with enhanced color saturation
finalImageBuffer[idx + 1] = colorizedData[idx + 1] * 1.3; // Enhance 'a' channel
finalImageBuffer[idx + 2] = colorizedData[idx + 2] * 1.3; // Enhance 'b' channel
}

// 4.  Create final image with enhanced processing pipeline
const finalImage = await sharp(finalImageBuffer, {
raw: {
width: dimensions.width,
height: dimensions.height,
channels: 3,
},
})
.toColorspace('lab')
// Apply multi-stage processing
//.blur(6.5) // Initial blur to reduce artifacts
//.gamma(1.1) // Slight gamma adjustment for better contrast
.modulate({
// Fine-tune color saturation
saturation: 1, //how "pure" a color appears versus how "washed out" or gray it looks.
//Increasing brightness makes an image look lighter (closer to white), while decreasing it makes it darker (closer to black)
brightness: 1.85, // Increase brightness by 85%
})
.toColorspace('srgb') // Convert back to RGB
.jpeg({
quality: 100,
chromaSubsampling: '4:4:4', // Preserve color quality
trellisQuantisation: true, // Enable trellis quantization for better quality
overshootDeringing: true, // Reduce ringing artifacts
optimizeScans: true, // optimizeProgressive scans
})
.toBuffer();

return finalImage;
} catch (error) {
console.error('Error in colorization post-processing:', error);
throw error;
}
}

Image

obiges Bild in NodeJS (dieses Bild sieht rötlich aus, ich will es nicht)
Das ist Python-Code

Code: Select all

import requests
import numpy as np
import cv2
import onnxruntime

def colorize(self,url, r_factor):
response = requests.get(url, timeout=10)
response.raise_for_status()
nparr = np.frombuffer(response.content, np.uint8)
image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

# Preprocess image:
# - Convert to LAB, extract L channel, convert back to RGB
targetL = cv2.cvtColor(image,cv2.COLOR_BGR2LAB)
targetL,_,_=cv2.split(image)

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)

# Resize, convert to float32, transpose, and add batch dimension
h, w, channels = image.shape

image = cv2.resize(image,(r_factor, r_factor))
image = image.astype(np.float32)
image = image.transpose((2, 0, 1))
image = np.expand_dims(image, axis=0).astype(np.float32)

# run deoldify:
colorized = self.session.run(None, {(self.session.get_inputs()[0].name):image})[0][0]
print(colorized)
#this prints [[[  1.8473316    0.60919094   0.         ...  40.865364 35.19843
# Postprocess image:
# - Transpose, convert BGR to RGB, resize, apply Gaussian blur
# - Convert back to LAB, split channels, resize
# - Merge L from original, A and B from colorized, convert back to BGR
colorized = colorized.transpose(1,2,0)
colorized = cv2.cvtColor(colorized, cv2.COLOR_BGR2RGB).astype(np.uint8)
colorized = cv2.resize(colorized,(w,h))
colorized = cv2.GaussianBlur(colorized,(13,13),0)
colorizedLAB = cv2.cvtColor(colorized,cv2.COLOR_BGR2LAB)
L,A,B=cv2.split(colorizedLAB)
colorizedLAB = cv2.resize(colorizedLAB,(w, h))
colorized = cv2.merge((targetL,A,B))
colorized = cv2.cvtColor(colorized,cv2.COLOR_LAB2BGR)

return colorized

Image

Bild oben in Python (ich möchte, dass die NodeJS-Version so aussieht)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post