L'écriture d'une image avec des valeurs à virgule flottante
Mon code se lit d'une image RVB, le traitement pour produire de l'virgule flottante résultats. Comment puis-je écrire ces valeurs comme une image, le maintien de ces valeurs à virgule flottante, en Matlab 7.6.0 (R2008a)?
Il est en fait possible d'adapter 64 bits de données de pixels (c'est à dire le nombre de bits nécessaires pour représenter un double-precision floating-point) dans certains formats d'image, en particulier une PNG. Et vous pouvez même récupérer les données exactement. La clé est de coder tout comme uint16 des valeurs et de l'utilisation d'un Truecolor image RVB (3 plans de couleurs de 16 bits de données) avec un alpha de transparence de la carte (16 bits). Voici l'étape d'encodage:
data=rand(4);% Just some sample data, a small 4-by-4 matrixhexData=num2hex(data(:));% Get the 16 digit hex codes for each pixelC=mat2cell(hexData,numel(data),[4444]);% Split the hex codes into 4 groups of 4C=cellfun(@(c){uint16(hex2dec(c))},C);% Convert each hex value into a 16 bit integercolorData=reshape([C{1:3}],[size(data)3]);% 4-by-4-by-3 uint16 color dataalphaData=reshape(C{4},size(data));% 4-by-4 uint16 alpha dataimwrite(colorData,'double_data.png','Alpha',alphaData);% Save image
Vous disposez maintenant d'un fichier image valide, bien qu'il vous ressemble probablement aléatoire poubelle si vous l'avez vue. Maintenant, vous pouvez décoder comme suit:
[imColor,~,imAlpha]=imread('double_data.png');% Load imageimSize=size(imColor);% Get image sizeimHex=[dec2hex(imColor(:,:,1))...% Convert each uint16 to hex and concatenatedec2hex(imColor(:,:,2))...
dec2hex(imColor(:,:,3))...
dec2hex(imAlpha)];imdata=reshape(hex2num(imHex),imSize(1:2));% Reproduce data
Et un contrôle d'égalité:
>> isequal(imdata,data)ans=logical1% it's the same!
Photos ou il n'est pas arrivé. Vous voulez dire que vous ne pouvez pas voir le 16 pixels de l'image dans mon post? C'est juste à côté de cette période... ou est-elle le délai?
Le nombre de bits utilisés pour représenter chaque élément d'une image numérique est appelé le de la profondeur de bits de l'image. La profondeur de bits nous indique le nombre de niveaux discrets, où un élément de l'image peut prendre. Si ces éléments seront stockés en tant que partie intégrante de type ou une variable de type point n'est pas pertinent: la profondeur de bits détermine exactement combien de niveaux discrets.
Comment la profondeur de bits est interprété dépend de savoir si une image est en niveaux de gris ou en couleur. Par exemple, un de 8 bits en niveaux de gris image des intensités dans [0,255], tandis qu'une image couleur 24 bits sera aussi ont des intensités dans [0,255]. Cette nomenclature est utilisée parce que le stockage d'un pixel de couleur 8 bits de rouge, de vert et de bleu de composants nécessite 24-bits. Afin d'éviter toute confusion, les images en couleur sont souvent appelés par le nombre de bits par canal de couleur. Par exemple, le format PNG prend en charge jusqu'à 16 bits par canal, ou 48 bits total pour le truecolor (RVB) avec une couche alpha.
La documentation pour imwrite répertorie les formats et le nombre de bits-profondeurs disponibles dans MATLAB.
Enregistrement d'une image couleur (MxNx3 matrice) à partir de MATLAB avec le plus haut niveau de précision:
%//Assume an image called 'im' of type double.%//First normalize to fall into [0,1].im=im-min(im(:));%//Save these numbers somewhereim=im/max(im(:));%//if you need to recover the original values later!%//Best PNG quality.imwrite(im,'image.png','bitdepth',16);
Si vous avez besoin de plus de précision, vous devez enregistrer votre image dans un général de format de données plutôt qu'une spécialité format de l'image.
Fonction suivante écrit une seule précision à échelle de gris ou RVB de l'image dans un fichier tiff. Et vous verrez que ces jours-ci, l'explorateur de Windows peut gérer la simple précision de l'image très bien si les valeurs des pixels sont dans la gamme de (0,1). Lorsque vous lisez de nouveau, vous pouvez utiliser imread comme d'habitude.
functionwriteftif(outim,outfilename)t=Tiff(outfilename,'w');ifsize(outim,3)==3t.setTag('Photometric',Tiff.Photometric.RGB);elseifsize(outim,3)==1t.setTag('Photometric',Tiff.Photometric.MinIsBlack);endt.setTag('Compression',Tiff.Compression.None);t.setTag('BitsPerSample',32);t.setTag('SamplesPerPixel',size(outim,3));t.setTag('SampleFormat',Tiff.SampleFormat.IEEEFP);t.setTag('ImageLength',size(outim,1));t.setTag('ImageWidth',size(outim,2));t.setTag('PlanarConfiguration',Tiff.PlanarConfiguration.Chunky);% Write the data to the Tiff object.t.write(single(outim));t.close();
Si votre valeur RVB est hors de la plage (0,1),il suffit de transformer la valeur RVB entre 0 et 1. Si vous voulez récupérer l'original de la valeur float,vous pouvez enregistrer la valeur de transformation en tant que partie du nom du fichier image.
Le problème est que je veux enregistrer ces valeurs comme une image avec la préservation de ces valeurs à virgule flottante depuis quand j'utilise imwrite fonction les valeurs converties à des entiers non signés.
Lorsque vous enregistrez une image, le spectateur a besoin de savoir quelle est la pleine gamme des valeurs.
La convention commune est que les valeurs sont des float, l'intervalle est [0..1], lorsque les valeurs sont uint8 l'intervalle est [0..255] etc.
Lorsque vous enregistrez l'image avec les valeurs flottantes comme 2.34, vous devriez vous demander comment le spectateur sera de savoir comment l'interpréter?
Ma réponse est: vous ne pouvez pas. Vous devez convertir vos valeurs d'une plage valide et de l'enregistrer. Par exemple, si votre flotteur de gamme est [0..10], vous pouvez multiplier toutes les valeurs par 1000 et enregistrer en tant que uint16. De cette façon, vous pouvez (presque) de préserver l'exactitude de la valeur flottante.
TIFF prend en charge à virgule flottante images de l'amende juste. Je ne pouvais pas moins de soins que le spectateur ne avec elle; c'est des données, il n'y a pas de bonne raison je ne devrais pas être en mesure d'avoir un pixel avec une valeur, par exemple, de 2.34. Si le pixel est de type float, alors la gamme est MIN_FLOAT à MAX_FLOAT. Oh, et oui, vous pouvez le faire avec le Tiff classe.
Il est en fait possible d'adapter 64 bits de données de pixels (c'est à dire le nombre de bits nécessaires pour représenter un double-precision floating-point) dans certains formats d'image, en particulier une PNG. Et vous pouvez même récupérer les données exactement. La clé est de coder tout comme
uint16
des valeurs et de l'utilisation d'un Truecolor image RVB (3 plans de couleurs de 16 bits de données) avec un alpha de transparence de la carte (16 bits). Voici l'étape d'encodage:Vous disposez maintenant d'un fichier image valide, bien qu'il vous ressemble probablement aléatoire poubelle si vous l'avez vue. Maintenant, vous pouvez décoder comme suit:
Et un contrôle d'égalité:
Vous voulez dire que vous ne pouvez pas voir le 16 pixels de l'image dans mon post? C'est juste à côté de cette période... ou est-elle le délai?
OriginalL'auteur gnovice
Le nombre de bits utilisés pour représenter chaque élément d'une image numérique est appelé le de la profondeur de bits de l'image. La profondeur de bits nous indique le nombre de niveaux discrets, où un élément de l'image peut prendre. Si ces éléments seront stockés en tant que partie intégrante de type ou une variable de type point n'est pas pertinent: la profondeur de bits détermine exactement combien de niveaux discrets.
Comment la profondeur de bits est interprété dépend de savoir si une image est en niveaux de gris ou en couleur. Par exemple, un de 8 bits en niveaux de gris image des intensités dans [0,255], tandis qu'une image couleur 24 bits sera aussi ont des intensités dans [0,255]. Cette nomenclature est utilisée parce que le stockage d'un pixel de couleur 8 bits de rouge, de vert et de bleu de composants nécessite 24-bits. Afin d'éviter toute confusion, les images en couleur sont souvent appelés par le nombre de bits par canal de couleur. Par exemple, le format PNG prend en charge jusqu'à 16 bits par canal, ou 48 bits total pour le truecolor (RVB) avec une couche alpha.
La documentation pour imwrite répertorie les formats et le nombre de bits-profondeurs disponibles dans MATLAB.
Enregistrement d'une image couleur (MxNx3 matrice) à partir de MATLAB avec le plus haut niveau de précision:
Si vous avez besoin de plus de précision, vous devez enregistrer votre image dans un général de format de données plutôt qu'une spécialité format de l'image.
OriginalL'auteur reve_etrange
Image avec des valeurs à virgule flottante peuvent être écrites dans le format image tiff. Voici un exemple:
Normal, il a besoin d'un support logiciel ce genre d'images
OriginalL'auteur PeterR
Fonction suivante écrit une seule précision à échelle de gris ou RVB de l'image dans un fichier tiff. Et vous verrez que ces jours-ci, l'explorateur de Windows peut gérer la simple précision de l'image très bien si les valeurs des pixels sont dans la gamme de (0,1). Lorsque vous lisez de nouveau, vous pouvez utiliser
imread
comme d'habitude.OriginalL'auteur Tae-Sung Shin
Si votre valeur RVB est hors de la plage (0,1),il suffit de transformer la valeur RVB entre 0 et 1. Si vous voulez récupérer l'original de la valeur float,vous pouvez enregistrer la valeur de transformation en tant que partie du nom du fichier image.
OriginalL'auteur user1923639
Lorsque vous enregistrez une image, le spectateur a besoin de savoir quelle est la pleine gamme des valeurs.
La convention commune est que les valeurs sont des float, l'intervalle est [0..1], lorsque les valeurs sont uint8 l'intervalle est [0..255] etc.
Lorsque vous enregistrez l'image avec les valeurs flottantes comme 2.34, vous devriez vous demander comment le spectateur sera de savoir comment l'interpréter?
Ma réponse est: vous ne pouvez pas. Vous devez convertir vos valeurs d'une plage valide et de l'enregistrer. Par exemple, si votre flotteur de gamme est [0..10], vous pouvez multiplier toutes les valeurs par 1000 et enregistrer en tant que uint16. De cette façon, vous pouvez (presque) de préserver l'exactitude de la valeur flottante.
Tiff
classe.OriginalL'auteur Yanai Ankri