Следующий код можно использовать для создания более тревожного случая того, как это может выглядеть:
Код: Выделить всё
import numpy as np
def background(N, M, nl, nf, nT, r):
a = nf*np.sin((2*np.pi/nT)*np.arange(N))
a=a.reshape(-1,1)
fuzz = nl + a*np.ones((N,M))
fuzz+= r*a*np.random.normal(size=(N,M))
return fuzz
def add_slider(B, s, v, w, a, r):
N, M = B.shape
amps = a+r*np.random.normal(size=M)
x=np.arange(N)
for i, y in enumerate(range(s, N, v)):
if i >= M: break
B[:,i]+=amps[i]*np.exp(-(x-y)**2/(2*w**2))
def subtracted(im):
return im - im.mean(1).reshape(-1, 1)
B = background(1000, 300, 0, 5, 100, 1)
add_slider(B, 0, 2, 40, 1, 1)
back = subtracted(B)
Для менее экстремального примера:
Код: Выделить всё
B2 = gs.background(1000, 300, 0, 5, 100, 1)
gs.add_slider(B2, 0, 2, 40, 5, 1)
back2 = subtracted(B2)
Я пробовал несколько вещей, но ни один из них не работает очень хорошо хорошо, когда я меняю некоторые параметры, используемые для создания изображения. Например, я пробовал применить размытие по Гауссу, что иногда работает, но получение правильной ширины может быть очень трудным, и это проблематично, когда линия более вертикальная. Я также попробовал вращающуюся маску, как в этом посте, но, похоже, ей мешает модулирующий уровень шума. Я также немного поэкспериментировал с преобразованиями радона, но и там не нашел ничего последовательного. Большинство стандартных методов обнаружения границ, таких как Canny, похоже, не работают, поскольку они, как правило, полагаются на локальные градиенты, которые полностью разрушаются шумом.
Я провел ограниченный поиск статей. по этой теме, но я не нашел ничего, что хорошо подходило бы для этой проблемы. Если возможно, я хочу найти решение, которое не полагается на знание многих деталей линии, например ее толщины.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ound-noise