Usunięcie zamazania na zdjęciu
Przykładowe kroki (Python, scikit-image/OpenCV, rozmycie ruchowe – PSF znany w przybliżeniu):
import numpy as np
import cv2
from skimage import restoration, img_as_float
# 1) Wczytanie i wstępne przetwarzanie
img = cv2.imread('blur.jpg', cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
f = img_as_float(img)
# 2) Delikatny denoise (opcjonalnie)
f_d = cv2.fastNlMeansDenoisingColored((f*255).astype(np.uint8), None, 5, 5, 7, 21)
f_d = f_d.astype(np.float32)/255.0
# 3) PSF ruchowy (długość L, kąt theta)
def motion_psf(L=15, theta=0, size=65):
psf = np.zeros((size, size), np.float32)
center = size//2
cv2.line(psf,
(center - L//2, center),
(center + L//2, center),
1, 1)
# rotacja o kąt
M = cv2.getRotationMatrix2D((center, center), theta, 1.0)
psf = cv2.warpAffine(psf, M, (size, size))
psf /= psf.sum() + 1e-8
return psf
psf = motion_psf(L=15, theta=20, size=65)
# 4) Dekonwolucja RL kanałami
result = []
for c in cv2.split(f_d):
r = restoration.richardson_lucy(c, psf, num_iter=25, clip=False)
result.append(r)
out = cv2.merge(result)
# 5) Delikatne wyostrzanie (Unsharp)
blur = cv2.GaussianBlur(out, (0,0), 1.0)
sharpen = cv2.addWeighted(out, 1.2, blur, -0.2, 0)
cv2.imwrite('deblurred.png', cv2.cvtColor((np.clip(sharpen,0,1)*255).astype(np.uint8), cv2.COLOR_RGB2BGR))
Uwaga: dopasuj L i kąt do swojego zdjęcia; dla defocus zamiast „psf ruchowy” użyj gaussowskiego (sigma ≈ promień rozmycia).