Verbesserung von Zeitungsfotos und Dekodierung verrauschter Nummernschilder mit Frequenzfiltern und räumlichen Techniken | von Prakhar Patel | Juni 2023

0
24


Eine Reise in die Bildwiederherstellung und optische Entschlüsselung für klarere Zeitungsbilder und lesbare Nummernschilder

Wir haben ein verrauschtes Bild eines Autos mit einem unleserlichen Nummernschild und möchten die Sichtbarkeit des Nummernschilds mithilfe von Bildverarbeitungstechniken verbessern.
Bei der Bildverarbeitung werden digitale Bilder manipuliert, um deren Qualität zu verbessern, nützliche Informationen zu extrahieren und durch Bildaufnahme oder -übertragung verursachte Verzerrungen zu korrigieren.
Das ultimative Ziel dieser Bildverarbeitungsaufgabe besteht darin, das Nummernschild lesbar zu machen, damit wir nützliche Informationen daraus extrahieren können. Dies könnte in verschiedenen Anwendungen nützlich sein, beispielsweise bei der Verkehrsüberwachung, der Strafverfolgung oder der Parkverwaltung.

Fangen wir an………

1. Importieren Sie die erforderlichen Bibliotheken für eine bestimmte Aufgabe

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
import cv2
from numpy.fft import fft2, fftshift, ifft2,ifftshift
from scipy import sign

Hier werden wir OpenCV-Bibliotheken für Aufgaben im Zusammenhang mit Laptop Imaginative and prescient verwenden.

2. Bild als Graustufenbild lesen

  • Der Grund für die Graustufenkonvertierung besteht darin, Bildverarbeitungsaufgaben wie Kantenerkennung, Segmentierung und Kontrastverbesserung zu vereinfachen.
picture = cv2.imread('automotive.png',cv2.IMREAD_GRAYSCALE)
picture= cv2.resize(picture,(500,333))
imshow(picture,cmap='grey')

3. Berechnen Sie die diskrete Fourier-Transformation des Autobildes.

  • Die diskrete Fourier-Transformation (DFT) ist ein mathematischer Algorithmus, der verwendet wird, um ein Zeitbereichssignal in seine Frequenzbereichsdarstellung umzuwandeln. Es zerlegt ein Sign in seine einzelnen Frequenzen, was zur Analyse des Frequenzinhalts eines Alerts und zum Herausfiltern unerwünschter Frequenzen nützlich sein kann.
  • Für diesen Schritt haben wir die zweidimensionale diskrete Fourier-Transformation (DFT) des eingegebenen Graustufenbilds des Autos mithilfe des Quick-Fourier-Transformations-Algorithmus (FFT) berechnet.
#apply 2nd DFT
f=np.fft.fft2(picture)

4. Verschieben Sie den Ursprung des Bildbereichs in die Mitte und berechnen Sie die Größe der Fourier-Transformation.

  • Wir haben das Betragsspektrum der Fourier-Transformation mit berechnet np.abs() Funktion und wendete eine logarithmische Transformation an, um den großen dynamischen Bereich der Größenwerte zu unterdrücken und ihn besser sichtbar zu machen

#shift to middle
fshift=np.fft.fftshift(f)

#magnitude
magnitude_spectrum=20*np.log(np.abs(fshift))

#visualizing
plt.subplot(121), plt.imshow(picture, cmap='grey')
plt.title('Enter picture'), plt.xticks([]),plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='grey')
plt.title('Magnitude'), plt.xticks([]),plt.yticks([])
plt.present()

5. Beachten Sie, dass weiße Spitzen im Fourier-Bereich das im Originalbild vorhandene periodische Rauschen erfassen.

  • Um das periodische Rauschen zu entfernen, haben wir die Funktion „peak_local_max“ verwendet, um die Koordinaten der lokalen Maxima in der logarithmisch transformierten Größe der Fourier-Transformation zu ermitteln. Wir setzen den Parameter „min_distance“ auf 6, was eine vernünftige Schätzung basierend auf dem Bild der Größe ist. Das bedeutet, dass wir nur Peaks auswählen, die mindestens 6 Pixel voneinander entfernt sind. Dies trägt dazu bei, die Auswahl falscher Peaks zu vermeiden, die durch Rauschen oder andere Artefakte im Bild verursacht werden können.
  • Die verschobene Fourier-Transformation an jedem Punkt (u,v) ist der Wert der Fourier-Transformation, nachdem sie so verschoben wurde, dass die Mitte des Frequenzbereichs der Nullfrequenz entspricht. Dies ist notwendig, um die inverse Fourier-Transformation durchzuführen und das gefilterte Bild zu erhalten.
# coordinates of the white peaks within the picture the middle is [150, 175]
from skimage.function import peak_local_max
coordinates = peak_local_max(magnitude_spectrum, min_distance= 6, exclude_border=0)

coordinates

7. Sie möchten das Originalbild im Fourier-Bereich so bereinigen, dass seine Größe nur noch einen einzigen hellen „Stern“ in der Mitte aufweist. Nachfolgend finden Sie ein Skript, das Ihnen beim Experimentieren mit der Breite des Filters (2L+1 x 2L+1) hilft, der Frequenzkomponenten des periodischen Rauschens abdeckt, das wir entfernen möchten.

#clear the picture to get single star within the middle
L = 3
dx,dy=np.form(picture)[0], np.form(picture)[1]
new= magnitude_spectrum.copy()

for coord in coordinates:
i=coord[0]
j=coord[1]
if i==dx//2 and j==dy//2:
proceed
else:
for k1 in np.arange(-L,L,1):
for k2 in np.arange(-L,L,1):
if i+k1>=0 and j+k2>=0 and that i+k1<dx and j+k2<dy:
new[i+k1,j+k2]=0
fshift[i+k1,j+k2]=0 # shifted DFT of automotive picture
imshow(new, cmap='grey')
plt.title("The scale of the neighbourhood is "+str(2*L+1)+"x"+str(2*L+1))

8. Führen Sie die inverse Fourier-Transformation durch (unter Verwendung modifizierter Frequenzkomponenten), um das Bild wiederherzustellen. Visualisieren Sie Ihr Ergebnis.

  • · Die inverse Fourier-Transformation ist die umgekehrte Operation der Fourier-Transformation. Es dient dazu, ein in den Frequenzbereich transformiertes Sign wieder in den Zeitbereich umzuwandeln. Dies ist nützlich, wenn Sie ein Sign im Frequenzbereich analysieren oder manipulieren möchten, es dann aber wieder in den Zeitbereich konvertieren müssen, um Operationen daran durchzuführen.
# Carry out inverse Fourier remodel to acquire the filtered picture
filtered_image = np.fft.ifftshift(fshift)
filtered_image = ifft2(filtered_image)

# Take the actual a part of the filtered picture (imaginary half is negligible)
filtered_image = np.actual(filtered_image)
image_back= (filtered_image-np.min(filtered_image))*255.0/(np.max(filtered_image)-np.min(filtered_image))

# Visualize the filtered picture
plt.imshow(image_back, cmap='grey')
plt.title('Filtered Picture')

9. Schneiden Sie das Bild auf, um nur die Nummernschildregion zu erhalten.

import skimage
from skimage import remodel
#scaled= remodel.rescale(image_back,1.2, anti_aliasing=False)
image_back = image_back[150:280,100:300]
plt.imshow(image_back,cmap='grey')

10. Gaußschen Filter anwenden

  • Weil es für seine Fähigkeit bekannt ist, lokalisiertes Rauschen im Fourier-Bereich zu eliminieren.
  • Der Gauß-Filter ist ein Tiefpassfilter, der niederfrequente Komponenten, die mit der Bildstruktur verknüpft sind, zurückhält und gleichzeitig hochfrequente Komponenten dämpft, die oft mit Rauschen oder winzigen Particulars verbunden sind.
from scipy import sign

# create a low-pass Gaussian filter
kernel = np.outer(sign.gaussian(image_back.form[0], 1), sign.gaussian(image_back.form[1], 1))
# discover Fourier remodel of the picture f(x,y)
freq = fft2(image_back)
# generate a kernel whose origin is within the top-left nook
kern = ifftshift(kernel) # h(x,y)
# calculate FFT of the kernel
freq_kernel = fft2(kern)
# multiply within the frequency area
low_pass_product = freq * freq_kernel
# compute the low-pass filtered picture
low_pass_im = ifft2(low_pass_product).actual

plt.imshow(low_pass_im, cmap='grey')

11. Wenden Sie eine Gammakorrektur an, um den Kontrast zu verbessern.

  • Bei der Gammakorrektur handelt es sich um eine nichtlineare Anpassung, die auf die Intensitätswerte eines Bildes angewendet wird. Dies kann je nach verwendetem Gammawert dazu führen, dass dunklere Bereiche dunkler und hellere Bereiche heller werden.
  • Ein Gammawert von weniger als 1 macht die dunklen Bereiche des Bildes heller, während die hellen Bereiche relativ unverändert bleiben. Dies wird manchmal als „Gammakomprimierung“ bezeichnet. Umgekehrt führt ein Gammawert größer als 1 dazu, dass die dunklen Bereiche des Bildes dunkler und die hellen Bereiche heller werden. Dies wird manchmal als „Gamma-Erweiterung“ bezeichnet.
from skimage import publicity,img_as_float

fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(10,5))
# Gamma corrected
gamma_corrected = publicity.adjust_gamma(image_back, 2)

# logarithmic corrected
logarithmic_corrected = publicity.adjust_log(image_back, 1)

ax[0,0].imshow(gamma_corrected,cmap='grey')
ax[0,1].imshow(logarithmic_corrected,cmap='grey')
ax[1,0].hist(gamma_corrected.ravel(), bins=30, histtype='step', shade='b' )
ax[1,1].hist(logarithmic_corrected.ravel(), bins=30, histtype='step', shade='b' )

12. Wählen Sie einen Mittelpunkt, um den herum Sie den Kontrast strecken und die vorherige Ausgabe normalisieren möchten

  • Kontraststreckung ist eine Technik in der Bildverarbeitung, mit der der Kontrast eines Bildes angepasst wird. Es wird häufig verwendet, um die visuelle Qualität von Bildern zu verbessern, die verwaschen erscheinen oder einen geringen Kontrast aufweisen. Bei der Kontrastdehnung werden die Intensitätswerte eines Bildes neu skaliert, um den Wertebereich über den gesamten Dynamikbereich des Bildes zu verteilen. Dies kann dazu beitragen, mehr Particulars im Bild hervorzuheben und es optisch ansprechender erscheinen zu lassen.
def normalize(depth, m, E):
I = depth
dx, dy = np.form(depth)[0], np.form(depth)[1]
eps = 0.001
cs = np.zeros((dx, dy))
for i in vary(dx):
for j in vary(dy):
cs[i, j] = (I[i, j] - m) * (E / (1 - m - eps))
return cs

# select a midpoint of 128 and most depth worth of 255
m = 100
E = 200

# apply distinction stretching to the Fourier-reconstructed picture
g = normalize(gamma_corrected, m, E)

# show the ensuing picture
plt.imshow(g, cmap='grey')

Nach der Normalisierung erreichten wir eine gewisse Klarheit des segmentierten Bildbereichs, allerdings nicht vollständig. Es könnte BHT 042 / BHT 012 sein. Wir konnten das Nummernschild bei Gamma- und logarithmischen Korrekturen deutlich sehen, bei der Normalisierung battle es jedoch nicht so klar.

Wenn Ihnen meine Arbeit gefällt und Sie mich unterstützen möchten …

  1. Der BESTE Weg, mich zu unterstützen, besteht darin, mir zu folgen Mittel Hier.
  2. Seien Sie einer der ERSTEN, der mir auf I folgtnstagram Hier.
  3. Folge mir auf LinkedIn Hier.
  4. Folge mir auf GitHub Hier.





Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here