Я согласен с мнением, что вы, вероятно, должны попытаться оптимизировать качество входного изображения.
Цветное размытие - типичный пример размытия движения. Насколько хорошо вы можете дебютировать, зависит от того, насколько большой или малый радиус размытия. Как правило, скорость движения автомобиля больше, чем больше размытость и поэтому сложнее восстановить.
Простым решением, которое несколько работает, является деинтерфейсирование изображений.
Обратите внимание, что это только немного более удобным для чтения, чем ваш входного изображения. Здесь я бросил все альтернативную линию и изменить размер изображения до половины его размера с помощью 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
Обратите внимание, что эффективные алгоритмы слепых деконволюций общего назначения до сих пор не найдены и является активным направлением исследований ,
Вы можете воспользоваться большим количеством размытия, попробуйте 'open'ing с большим ядром. Дайте нам знать результат, который вы получили. –
Что вы подразумеваете под «try' open'ing with large kernel» – VICTOR
Я имел в виду 'open' морфологическую операцию, то есть' erode', а затем 'dilate'. Попробуйте с большим ядром и экспериментируйте с разным размером. –