2016-08-08 4 views
9

Ich mache eine Kennzeichenerkennung. Ich habe die Platte ausschneiden, aber es ist sehr verschwommen. Daher kann ich die Ziffern/Zeichen nicht aufteilen und erkennen.Denoise und Filter ein Bild

Hier ist mein Bild:

enter image description here

ich denoise versucht haben es scikit Bild Funktion durch Verwendung.

Zuerst importieren die Bibliotheken:

import cv2 
from skimage import restoration 
from skimage.filters import threshold_otsu, rank 
from skimage.morphology import closing, square, disk 

dann las ich das Bild und wandeln es in Graustufen

image = cv2.imread("plate.jpg") 
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

ich versuchen entfernen Sie das Rauschen:

denoise = restoration.denoise_tv_chambolle(image , weight=0.1) 
thresh = threshold_otsu(denoise) 
bw = closing(denoise > thresh, square(2)) 

Was? Ich habe ist:

enter image description here

Wie Sie sehen können, alle Ziffern sind zusammen gemischt. So kann ich nicht trennen und die Zeichen eins nach dem anderen erkennen.

Was ich erwarte, ist so etwas wie dieses (ich es zeichnen):

enter image description here

ich Hilfe suchen, wie kann ich besser das Bild filtern? Vielen Dank.

============================================== ======================= UPDATE:

Nach der Verwendung von skimage.morphology.erosion, ich habe:

enter image description here

+0

Sie können die Vorteile einer hohen Unschärfe nutzen, versuchen Sie es mit einem großen Kernel. Lassen Sie uns wissen, das Ergebnis, das Sie erhalten .. –

+0

Was meinst du mit "versuchen' open'ing mit großen Kernel " – VICTOR

+0

Ich meinte" öffnen "die morphologische Operation, d. H." Erodieren "gefolgt von" erweitern ". Versuche es mit einem großen Kernel und experimentiere mit verschiedenen Größen. –

Antwort

1

result using ChanVeseBinarize with binarized kernel

ChanVeseBinarize mit einem Bild verbessert binarisierten Kernel gab mir dieses Ergebnis. Dies ist hilfreich, um 4,8,1 und 2 hervorzuheben. Ich denke, Sie müssen mit jedem Zeichen eine getrennte Faltung durchführen, und wenn der Peak der Faltung höher als ein Schwellenwert ist, können wir annehmen, dass der Buchstabe an der Stelle des Peaks vorhanden ist . Um Verzerrungen zu vermeiden, müssen Sie die Faltung mit wenigen verschiedenen Schriftarten eines bestimmten Zeichens durchführen.

enter image description here

Eine weitere mögliche Verbesserung unter Verwendung von Ableitungsfilter und wenig Gaußsche Glättung. Die K & X sind nicht so verzerrt wie die vorherige Lösung.

+0

Danke für Ihre Antwort. Welche Python-Bibliothek enthält die Funktion 'ChanVeseBinarize'? – VICTOR

+1

Ich verwendete Mathematica, die eine direkte Implementierung hat ... der Schrank, den ich in Python finden kann, ist https://github.com/kevin-keraudren/chanvese....Ich habe ein bisschen eine bessere Lösung, aber werde nach seiner veröffentlichen schlüssiger. – Pal

6

Erstens dieses Bild scheint mehr durch Unschärfe verunstaltet zu sein, als durch Noize, also gibt es keine guten Gründe, es zu entlarven, stattdessen Deblocking zu versuchen.

Die einfachste wäre inverse Filterung oder sogar Wiener Filterung. Dann müssen Sie den Hintergrund des Bildes von den Buchstaben durch den Grad der Helligkeit trennen, zum Beispiel mit dem Watershed-Algorithmus. Dann erhalten Sie separate Buchstaben, die Sie zum Beispiel durch einen der Klassifikatoren durchlaufen müssen, basierend auf neuronalen Netzen (sogar ein einfaches Feed-Forward-Netz wäre in Ordnung).

Und dann erhalten Sie schließlich die textliche Darstellung. So werden solche Anerkennungen normalerweise gemacht. Es gibt gute book by Gonzalez&Woods, versuchen Sie, dort eine ausführliche Erklärung zu suchen.

7

Ich stimme der Meinung zu, dass Sie wahrscheinlich versuchen sollten, die Qualität des Eingangsbildes zu optimieren.

Nummernschildunschärfe ist ein typisches Beispiel für Bewegungsunschärfe. Wie gut Sie deblur können, hängt davon ab, wie groß oder klein der Unschärfe-Radius ist. Generell ist die Geschwindigkeit des Fahrzeugs größer, der Unschärfe-Radius größer und daher schwieriger wiederherzustellen.

Eine einfache Lösung, die etwas funktioniert, ist das Deinterlacing von Bildern.

enter image description here

Beachten Sie, dass es nur wenig besser lesbar als Ihr Eingangsbild ist. Hier habe ich jede zweite Zeile fallen gelassen und in der Größe des Bildes auf die Hälfte ihrer Größe mit PIL/Kissen und das ist, was ich bekommen:

from PIL import Image 
img=Image.open("license.jpeg") 
size=list(img.size) 
size[0] /= 2 
size[1] /= 2 
smaller_image=img.resize(size, Image.NEAREST) 
smaller_image.save("smaller_image.png") 

Die nächste und formaler Ansatz ist Entfaltungs.

Da die Unschärfe durch die Faltung von Bildern erreicht wird, erfordert Debbluring die Umkehrung der Faltung oder Entfaltung des Bildes. Es gibt verschiedene Arten von Entfaltungsalgorithmen wie die Wiener Dekonvolution, die Richardson-Lucy-Methode, die Radon-Transformation und einige Arten der Bayes-Filterung.

Sie können Wiener Dekonvolution Algorithmus mit dieser code anwenden. Spielen Sie mit dem Winkel, Durchmesser und Signal-Rausch-Verhältnis und sehen Sie, ob es einige Verbesserungen bietet.

Das Modul skimage.restoration bietet auch die Implementierung von unsupervised_wiener und richardson_lucy Dekonvolution.

Im folgenden Code habe ich beide Implementierungen gezeigt, aber Sie müssen die PSF ändern, um zu sehen, welche besser passt.

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 
from skimage import color, data, restoration 
from scipy.signal import convolve2d as conv2 

img = cv2.imread('license.jpg') 
licence_grey_scale = color.rgb2gray(img) 

psf = np.ones((5, 5))/25 

# comment/uncomment next two lines one by one to see unsupervised_wiener and richardson_lucy deconvolution 
deconvolved, _ = restoration.unsupervised_wiener(licence_grey_scale, psf) 
deconvolved = restoration.richardson_lucy(licence_grey_scale, psf) 

fig, ax = plt.subplots() 
plt.gray() 
ax.imshow(deconvolved) 
ax.axis('off') 
plt.show() 

die meisten dieser Entfaltungs alogirthms benötigen Sie leider die Unschärfe Kernel im Voraus wissen (auch bekannt als der Point Spread Function aka PSF).

Hier, da Sie die PSF nicht kennen, so müssen Sie blinde Dekonvolution verwenden. Blind Deconvolution versucht, das Originalbild ohne Kenntnis des Unschärfe-Kernels zu schätzen.

ich dies mit Ihrem Bild nicht versucht haben, aber hier ist eine Python-Implementierung von blinden Dekonvolutionsalgorithmus: https://github.com/alexis-mignon/pydeconv

Beachten Sie, dass ein wirksames Allzweck blinder Dekonvolutionsalgorithmen ist noch nicht gefunden worden und ist ein aktives Forschungsgebiet .