[PYTHON] 8-Bit-Graustufen-Downscaling auf Bilder und Bildkontrast

Annahme

Downscaling bedeutet hier Downscaling in Bezug auf Bildabtastung.

Bild-Downscaling

Hier werden wir über Graustufenbilder sprechen. Im Allgemeinen besteht ein Graustufenbild aus einer Sammlung von "1-Kanal" -Pixeln wie 8-Bit, 16-Bit, 32-Bit usw. (Farbbilder wie RGB haben R-, G- und B-Kanäle, die in ein Bild integriert sind. Dies ist wichtig. Mit anderen Worten, ein RGB-Bild verfügt über drei 8-Bit-Graustufenbilder. Genau genommen kann es eine α-Komponente geben (eine Komponente, die Transparenz angibt), aber die α-Komponente ähnelt auch einem um eins vergrößerten 8-Bit-Graustufenbild.)

16-Bit-Bilder werden häufig in medizinischen Bildern verwendet. 16-Bit-Bilder können Zahlen zwischen 0 und 65535 als Pixelwerte enthalten. Andererseits können 8-Bit-Bilder nur Zahlen von 0 bis 255 enthalten. (Signiert und nicht signiert werden hier nicht erwähnt.)

Bei der Bildverarbeitung und beim maschinellen Lernen werden High-Bit-Bilder verkleinert und in 8-Bit-Bilder konvertiert, um Berechnungen zu vereinfachen oder die Verarbeitung zu beschleunigen. Bitte beachten Sie, dass das Bild seltsam ist, wenn Sie während dieser Verkleinerung einen Fehler machen.

Beispielbild

Ich werde JIRAs Röntgenbild ausleihen. Das mit LEE bedeutet unkomprimiertes Bild. Benutze das. Beispielbild

Beispiel für eine Verkleinerung (16-Bit bis 8-Bit)

Verwenden Sie zuerst pydicom, um das Bild zu laden und es als numpy ndarray zu behandeln.

!pip install pydicom

Laden Sie die Daten.

import pydicom
import numpy as np
ds = pydicom.dcmread('CR_LEE_IR87a.dcm')#Geben Sie den Pfad an

#Pixel extrahieren (als ndarray behandelt)
pixels = ds.pixel_array

#Da es nach links und rechts gedreht ist, geben Sie es zurück
pixels = np.fliplr(pixels)

#Als Bild anzeigen
import matplotlib.pyplot as plt
plt.imshow(pixels,cmap="gray")#Beides ist erforderlich
plt.show() 

ダウンロード (2).png

Stellen Sie zur Sicherheit sicher, dass dieses Bild nicht 8-Bit ist. Wie Sie am DICOM-Tag sehen können, können Sie es auch sehen, indem Sie direkt auf die Pixel schauen.

#Schauen Sie sich die Pixel in diesem Bild an
print (pixels[512,512]) # 3186

Sie können sehen, dass der Pixelwert bei Pixel (x, y) (512.512) 3186 beträgt. Mit anderen Worten, es ist 16-Bit, weil es nicht zwischen 0 und 255 liegt und keine reelle Zahl ist.

Jetzt bist du bereit.

numpy

Ich werde es einfach in 8bit konvertieren.

#Versuchen Sie eine 8-Bit-Konvertierung mit numpy
np_img = pixels.astype('uint8')
plt.imshow(np_img,cmap="gray")
plt.show() 

ダウンロード (3).png

Es ist anders.

Pillow

#Verwenden Sie Kissen
from PIL import Image, ImageOps
pil_img = Image.fromarray(pixels)
pil_img = pil_img.convert('L')#L:grayscale
plt.imshow(pil_img,cmap="gray")#Beides ist erforderlich
plt.show() 
print(np.asarray(pil_img)[512,512]) #255,Es fühlt sich völlig außer Reichweite an.

ダウンロード (4).png

Das ist auch anders.

OpenCV

#benutze opencv
#Da es mit der folgenden Methode nicht konvertiert werden kann, geben Sie in Schritt 1 einen Typ von numpy ein()Möglicherweise können Sie nur dieselbe Methode wie die Konvertierungsmethode verwenden.
#Vielleicht ist meine Verwendung falsch. .. Nennen Sie es als Fehlerbeispiel.
import cv2
cv_img16 = cv2.cvtColor(pixels, cv2.COLOR_BAYER_GR2GRAY)
cv_img8 = cv2.cvtColor(pixels, cv2.COLOR_BAYER_GR2GRAY) #Zum Kopieren und Konvertieren.
cv2.convertScaleAbs(cv_img16, cv_img8, 1/255,)#Nicht konvertiert
plt.imshow(cv_img8,cmap="gray")
plt.show() 
print(cv_img8[512,512])#Stellen Sie sicher, dass es nicht konvertiert wird.

Scikit-image

#Verwenden Sie Skimage
import skimage
sk_img = skimage.img_as_ubyte(pixels)
plt.imshow(sk_img,cmap="gray")#Beides ist erforderlich
plt.show() 

Oh! Ich denke, das ist eine Täuschung, und wenn Sie genau hinschauen, werden die Pixel zerstört.

ダウンロード (5).png

Downscaling mit dem ImageJ-Algorithmus

Ich habe versucht, ImageJ Downscale zu implementieren. Normalisieren Sie mit maximalen, minimalen und Skalierungsfaktoren.

#Normalisierung von ImageJ entlehnt
amin=np.amin(pixels)
amax=np.amax(pixels)
scale = 255.0/(amax-amin) # 256.0/(amax-amin+1)
pixelsByte = np.copy(pixels)
# pixelsByte = pixelsByte - amin #Es fühlt sich an, als müsste der Mindestwert nicht anders sein.
pixelsByte = pixelsByte*scale # 0-Skalieren Sie auf den Bereich von 255
# np.clip(pixelsByte,0,255) #Es war überflüssig
pixelsByte = np.uint8(pixelsByte) #In vorzeichenlose Bytes konvertieren

print(np.asarray(pixelsByte)[512,512])
plt.imshow(pixelsByte,cmap="gray")
plt.show() 

ダウンロード (6).png

Das ist das. Dies ist das Bild, nach dem ich gesucht habe.

Visionary Imaging Services, Inc.

Recommended Posts

8-Bit-Graustufen-Downscaling auf Bilder und Bildkontrast
Graustufenbild und als CSV speichern
So passen Sie den Bildkontrast in Python an
Ändern Sie die Größe des Bildes auf die angegebene Größe und schwärzen Sie die Ränder