Следующее, на мой взгляд, должно работать: возьмите 2D БПФ изображения, обрежьте высокочастотные компоненты, которые вызывают волнистые биты на границах, инвертируйте его обратно и получите сглаженное изображение.
Ниже приведена реализация, которая не дала ожидаемого результата, но в любом случае могла бы быть полезной.
После вашей строки #Image manipulation goes here
:
imagefft = np.fft.fft2 (image)
Убейте высокочастотные биты этой функцией, которая обнуляет значения выше значения 85-го процентиля:
def smoothen(this):
return this * (np.percentile(this, 85) > this)
Примените функцию smoothen
к абсолютному значению двумерного обратного преобразования Фурье, и преобразовать полученный массив обратно:
imageres = (np.real(np.fft.ifft2(smoothen(np.real(imagefft)+np.imag(imagefft))))-
np.imag(np.fft.ifft2(smoothen(np.real(imagefft)+np.imag(imagefft)))))
Используя plt.imshow(imageres)
, получим:
Увеличение контраста:
tminval = np.percentile(imageres, 10)
maxval = np.percentile(imageres, 90)
pixvals = np.clip(imageres, minval, maxval)
pixvals = ((pixvals - minval) / (maxval - minval)) * 255
Проверьте результат с помощью plt.imshow(pixvals)
:
Это явно не сработало.
I оставьте этот ответ здесь, потому что реализация, по общему признанию, неверна, теория верна, я считаю, что это может быть полезным в любом случае. Не стесняйтесь редактировать это.