2017-03-21 14 views
0

Ich muss Farbkanal des Bildes (speziell "Cb") in 8x8 Blöcke aufteilen, um DCT-Koeffizienten zu modifizieren und später wieder zusammenzusetzen.Wie konvertiert man Array zu Bild Farbkanal in Python?

Ich versuche, es zu tun image.extract_patches_2d()

mit Jedoch habe ich nicht den Kanal

from PIL import Image 
from sklearn.feature_extraction import image 
import numpy as np 

pic = Image.open('lama.png') 
pic_size = pic.size 
ycbcr = pic.convert('YCbCr') 
(y, cb, cr) = ycbcr.split() 


acb = np.asarray(cb) 
patches = image.extract_patches_2d(acb, (8, 8)) 
acb2 = image.reconstruct_from_patches_2d(patches, (500,500)) 
cb_n = Image.fromarray(acb2, 'L') 

scheinen auch auf die Patches wieder zusammen Array ohne Änderungen wieder zusammenzusetzen entspricht nicht dem ursprünglichen Kanal :

cb als Bild gespeichert:

enter image description here

Cb von Patches (cb_n in Code) gestellt:

enter image description here

So gibt es etwas mit dem Code falsch? Oder ist es unmöglich, Farbkanäle aus Pfaden (Blöcken) mit image.reconstruct_from_patches_2d wiederherzustellen?

Und wenn ja, gibt es einen besseren Weg zu tun, was ich brauche?

Danke für das Lesen, schätze jede Hilfe.

Antwort

1

Bevor Sie Image.fromarray() auf acb2 aufrufen, vergewissern Sie sich, dass Sie den Dtype wie am Anfang in int ändern. Die image.reconstruct_from_patches_2d ändert Ihre Bildwerte in float64, während die ursprünglichen Werte in cbuint8 sind. Dies ist die einzige Fehlerquelle, die ich bekomme. Ansonsten funktioniert Ihr Code wie erwartet.

Code aus ändern:

acb2 = image.reconstruct_from_patches_2d(patches, (500,500)) 
cb_n = Image.fromarray(acb2, 'L') 

zu:

acb2 = image.reconstruct_from_patches_2d(patches, (500,500)) 
#ADD THIS LINE 
acb2 = acb2.astype(np.uint8) 
cb_n = Image.fromarray(acb2, 'L') 

HINWEIS: (Unrelated oben)

auch sicher, dass Sie korrekte Abmessungen in reconstruct_from_patches_2d für die verwenden Bildgröße. Wie Sie (500,500) angegeben haben, nehme ich an, dass die Breite dieselbe wie Höhe (500) ist. Aber in Bildern, wo Höhe und Breite unterschiedlich sind, wird Image moduleSpalte-Haupt sein, während numpy (und Python-Arrays standardmäßig) Zeile-Haupt sind. So ,

pic_size = pic.size 

berichten Ausgang (Width, Height), aber wenn in reconstruct_from_patches_2d arbeiten, verwenden (Height, Width).

+0

Vielen Dank, es funktioniert! –

Verwandte Themen