2016-08-08 5 views
9

Я принимаю опознавательный знак на номерном знаке. Я вырезаю пластину, но это очень размыто. Поэтому я не могу разделить цифры/символы и распознать их.Denoise and filter image

Вот мое изображение:

enter image description here

Я попытался DeNoise это за счет использования scikit изображения функции.

Во-первых, импортировать библиотеки:

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

тогда, я прочитал изображение и преобразовать его в серого

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

Я пытаюсь удалить шум:

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

Что У меня есть:

enter image description here

Как вы можете видеть, все цифры смешаны вместе. Таким образом, I не может отделить их и распознать символы один за другим.

Что я ожидаю что-то вроде этого (я рисую его):

enter image description here

Я ищу помощь, как я могу лучше фильтровать изображения? Спасибо.

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

После использования skimage.morphology.erosion, я получил:

enter image description here

+0

Вы можете воспользоваться большим количеством размытия, попробуйте 'open'ing с большим ядром. Дайте нам знать результат, который вы получили. –

+0

Что вы подразумеваете под «try' open'ing with large kernel» – VICTOR

+0

Я имел в виду 'open' морфологическую операцию, то есть' erode', а затем 'dilate'. Попробуйте с большим ядром и экспериментируйте с разным размером. –

ответ

1

result using ChanVeseBinarize with binarized kernel

ChanVeseBinarize с изображением расширенного двоичным вида, ядром дал мне этот результат. Это полезно выделить 4,8,1 и 2. Я думаю, вам нужно сделать отдельную свертку с каждым символом, и если пик свертки выше порогового значения, мы можем предположить, что письмо должно присутствовать в месте расположения пика , Чтобы позаботиться об искажении, вам нужно сделать свертку с несколькими шрифтами определенного типа.

enter image description here

Другой потенциал улучшения использования производной фильтра и немного гауссовского сглаживания. K & X не так искажены, как предыдущее решение.

+0

Спасибо за ваш ответ. В какой библиотеке Python содержится функция 'ChanVeseBinarize'? – VICTOR

+1

Я использовал математику, которая имеет прямую реализацию ... шкаф, который я могу найти в Python, - это https://github.com/kevin-keraudren/chanvese. У меня есть немного лучшее решение, но опубликовано после его более убедительным. – Pal

6

Во-первых, это изображение, похоже, более разрушено размытием, чем путем noize, поэтому нет никаких веских причин, чтобы смягчить его, попробуйте вместо этого заговорить.

Простейшей будет инверсная фильтрация или даже фильтрация Винера. Затем вам нужно будет отделить фон изображения от букв уровнем яркости, например, с помощью алгоритма водораздела. Затем вы получите отдельные буквы, которые вам нужно пройти через один из классификаторов, например, на основе нейронных сетей (даже упрощенная сеть прямой передачи будет в порядке).

И тогда вы, наконец, получите текстовое представление. Так обычно делаются такие признания. Там хорошо book by Gonzalez&Woods, попробуйте найти подробное объяснение там.

7

Я согласен с мнением, что вы, вероятно, должны попытаться оптимизировать качество входного изображения.

Цветное размытие - типичный пример размытия движения. Насколько хорошо вы можете дебютировать, зависит от того, насколько большой или малый радиус размытия. Как правило, скорость движения автомобиля больше, чем больше размытость и поэтому сложнее восстановить.

Простым решением, которое несколько работает, является деинтерфейсирование изображений.

enter image description here

Обратите внимание, что это только немного более удобным для чтения, чем ваш входного изображения. Здесь я бросил все альтернативную линию и изменить размер изображения до половины его размера с помощью PIL/подушки, и это то, что я получаю:

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") 

Следующая и более формальный подход деконволюции.

Поскольку размывание достигается с помощью свертки изображений, для устранения затухания требуется выполнение инверсии свертки или деконволюции изображения. Существуют различные типы алгоритмов деконволюции, таких как деконволюция Винера, Метод Ричардсона-Люси, преобразование Радона и несколько типов байесовской фильтрации.

Вы можете применить алгоритм деконволюции Wiener, используя этот code. Играйте с коэффициентом угла, диаметра и отношения сигнал/шум и посмотрите, улучшится ли он.

Модуль skimage.restoration также обеспечивает реализацию как unsupervised_wiener, так и richardson_lucy deconvolution.

В приведенном ниже коде я показал обе реализации, но вам нужно будет изменить psf, чтобы увидеть, какой из них лучше подходит.

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() 

К сожалению, большинство из этих деконволюции alogirthms требуют, чтобы вы знали заранее размытости ядра (ака форы Function ака PSF).

Здесь, поскольку вы не знаете PSF, вам придется использовать слепую деконволюцию. Blind deconvolution пытается оценить исходное изображение без знания ядра размытия.

Я не пробовал это с вашим изображением, но вот реализация Python слепого алгоритма деконволюции: https://github.com/alexis-mignon/pydeconv

Обратите внимание, что эффективные алгоритмы слепых деконволюций общего назначения до сих пор не найдены и является активным направлением исследований ,