Я хочу удалить вертикальную линию с изображения (пример). Я взял 2D БПФ и попытался применить маску, чтобы подавить линию. Nonethelesse подход не очень эффективен, потому что я теряю важную часть информации. Как я могу улучшить обработку данных БПФ? В БПФ, как найти линию?
Мой фрагмент кода:
import numpy as np
import matplotlib.pyplot as plt
from skimage import io
from skimage import data, img_as_float
Path_input = "C:\\Users\\yoyo\\Desktop\\"
imggray = img_as_float(data.astronaut())[:,:,0]*255 #opening image
imggray[:,254:255] = 0 #force a vertical line
plt.imshow(imggray);plt.show()
imfft = np.fft.fft2(imggray)
mags = np.abs(np.fft.fftshift(imfft))
angles = np.angle(np.fft.fftshift(imfft))
visual = np.log(mags)
visual2 = (visual - visual.min()) / (visual.max() - visual.min())*255
plt.imshow(visual2);plt.show()
mask = io.imread(Path_input + 'mask_astro.png')[:,:,0]
mask = (mask < 100)
visual[mask] = np.mean(visual)
newmagsshift = np.exp(visual)
newffts = newmagsshift * np.exp(1j*angles)
newfft = np.fft.ifftshift(newffts)
imrev = np.fft.ifft2(newfft)
newim2 = np.abs(imrev).astype(np.float32)
plt.imshow(newim2);plt.show()
----- РЕДАКТИРОВАТЬ ПОЗЖЕ ----
Мое «настоящее» изображение:
https://image.noelshack.com/fichiers/2018/36/5/1536312281-test.png
Спасибо за интерес. Это пример, в моих данных есть определенное количество строк
Ответы, как правило, равносильны вопросам. Пожалуйста, используйте в своем вопросе более репрезентативные изображения. Также добавьте любую имеющуюся у вас соответствующую информацию о том, сколько строк у вас есть, их интервал, что их вызывает, регулярные ли они, занимают ли они всю высоту изображения, являются ли они чисто черными или просто темными ...
Вот это да. Ваши «настоящие» изображения не могли бы быть дальше от вашего примера с космонавтом, если бы они были на Луне. Я думаю, вам нужно более конкретно указать, какую «линию» вы хотите удалить и какого результата вы хотите достичь.
И, пожалуйста, опубликуйте исходное изображение само по себе в реальном разрешении, если вы хотите, чтобы люди попробовали и, возможно, сами улучшили ваш код на нем.
Предупреждение о проблеме XY: ваша проблема настоящий заключается в том, что вы хотите обнаружить «элементы, которые необходимо сохранить», несмотря на наличие горизонтальных линий шума?
Готово, вы можете скачать картинку
Кажется, что ширина этой линии составляет 1 пиксель.
В этом случае можно избавиться от линии с горизонтальным средний фильтр размера 3 (применяется к узкой колонке)
Редактировать
На реальном снимке мы видим горизонтальные дефектные ряды.
Сначала вы можете определить их положение по оси Y, используя фильтры, открывающие края, такие как фильтр Собеля.
Затем примените медианный фильтр с преимущественно вертикальной апертурой только к плохим областям (или какую-то интерполяцию, как заметил @SilverMonkey в комментариях).
Пример быстрой обработки OpenCV с CV_MEDIAN filter size 11 x 3
, примененной дважды с двумя ROI (областью интересов) около y = 110 и y = 205. Отметим хорошую компенсацию второго дефекта, но над первым нужно доработать. Особенности сохранены.
Спасибо за Ваш ответ. Если вы видите мое «реальное изображение», необходимо сохранить самые темные части моего изображения, и на них может повлиять медианный фильтр.
Левая - изображение для лечения? Но где же вертикаль?
вертикальная линия в моем примере и горизонтальная извините
@MBo похоже, что вы ответили на исходный вопрос, но не прошли тест на «телепатию»: -o
Однонаправленный (здесь вертикальный) медианный фильтр должен сохранять объекты с ObjSize> FilterSize. Нужен эксперимент. Обратите внимание - серебряной пули нет. Любая обработка ухудшит качество изображения, и главная проблема - минимизировать искажения.
Также обратите внимание: вы можете легко найти y-координаты дефектных строк (используя любой фильтр, раскрывающий края, например Sobel) и обрабатывать только узкую строку, как я сказал в ответе.
Помимо медианного фильтра, столбец при необходимости может быть интерполирован другими методами.
Это просто выглядит как один столбец черного цвета, не могли бы вы просто проверить это, а затем перезагрузить изображение? то есть разделить изображение пополам без черной линии, а затем сшить