[img]https://i.sstatic. net/HgSY8ROy.png[/img]
Камера немного перемещается между изображениями, поэтому хотелось бы автоматизировать процесс. Но я знаю, что нужные мне линии всегда проходят по всему изображению, от левого края до правого, и под углом, довольно близким к горизонтали.
Я пробовал использование преобразования Хафа из изображения как непосредственно на изображении, так и в результате обнаружения краев, но с очень ограниченным успехом. Вот пример кода и результаты использования преобразования Хафа и построения наиболее заметных линий, как показано здесь:
Код: Выделить всё
from skimage.transform import hough_line, hough_line_peaks
from skimage.filters import scharr
from skimage.color import rgb2lab
import matplotlib.image as mpimg
im = mpimg.read('image.png')
edges = scharr(rgb2lab(im[:,:,:])[:,:,0]) # Performing edge detection on the L-channel
angles = np.linspace(0.95*np.pi/2, 1.05*np.pi/2, 100) # Using a fairly narrow range of possible angles
h, theta, d = hough_line(edges, angles)
peaks = hough_line_peaks(h, theta, d, threshold=0.99*np.amax(h)) # Using a high threshold, default is 0.5*max(h)
plt.imshow(im)
for _, angle, dist in zip(*peaks):
(x0, y0) = dist * np.array([np.cos(angle), np.sin(angle)])
plt.axline((x0, y0), slope=np.tan(angle + np.pi / 2), lw=0.5, alpha=0.75, c='r')

Много и много линий были (неправильно) идентифицированы, но не те, которые мне нужны.
Я также попробовал вероятностное преобразование Хафа:
Код: Выделить всё
from skimage.transform import probabilistic_hough_line
lines = probabilistic_hough_line(edges, threshold=10, line_length=5000, theta=angles)
plt.imshow(im)
for l in lines:
plt.plot([l[0][0], l[1][0]], [l[0][1], l[1][1]], c='r', alpha=0.75, lw=0.5)

На этот раз похоже, что строки, которые мне нужны, действительно были идентифицированы, но более или менее, но также и множество других строк. Я пытался изменить параметр порога, но без видимого эффекта.
Я понимаю, что, возможно, мне не удастся автоматически найти именно те строки, которые мне нужны, так как есть и другие линии, это изображение , но то, что я нашел до сих пор, выглядит просто безумием. Мы будем очень признательны за любые предложения.
Изменить:
Я обнаружил, что если использовать небольшое размытие по Гауссу, и детектор края Канни вместо Шарра, кажется, работает намного лучше:
Код: Выделить всё
from skimage.feature import canny
l = rgb2lab(im[:,:,:])[:,:,0]
edges = canny(gaussian(l, 3), 1, 10, 20)


Обновление: Вот исходное изображение:
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-in-image
Мобильная версия