Нарисуйте линию между двумя пикселями на изображении в градациях серого в Джулии

У меня есть изображение в оттенках серого в Джулии, и я хочу нарисовать прямую линию на изображении. У меня есть две пары координат. Они представляют начальную (x1,y1) и конечную (x2,y2) позиции пикселей, где линия должна начинаться и заканчиваться. Я не знаю, как найти позиции пикселей, которые попадают между этими двумя точками, которые нужно раскрасить, чтобы моя линия появилась на изображении.

Я не хочу делать это с помощью интерактивного инструмента или аннотации, например, потому что мне нужно сделать это для многих изображений на основе точных координат, указанных для изображения.

Мой код пока выглядит так:

using Images, Colors, ImageView

function convert_rgb_image_to_greyscale(imagefilepath)
    img = load(imagefilepath)
    my_img_grey = convert(Image{Gray}, my_img)
    view(my_img_grey, pixelspacing = [1,1])

    return my_img_grey
end

imagefilepath = "myimage.jpg"
my_img_grey = convert_rgb_image_to_greyscale(imagefilepath)

start_pos = [1048 48] # (x1,y1)
end_pos = [1050 155] # (x2,y2)

Я пробовал просматривать Interpolation.jl и некоторые сообщения об обработке изображений здесь, в блогах и т. Д., Но, похоже, я не могу заставить это работать.

Что у меня есть (не обращайте внимания на цвета) Изображение, которое я конвертирую в оттенки серого То, что я хочу (игнорировать цвета)Серая версия этого


person lara    schedule 26.10.2016    source источник
comment
взгляните на линейный алгоритм Брезенхема   -  person Tasos Papastylianou    schedule 27.10.2016


Ответы (1)


Спасибо Tasos Papastylianou. Я нашел код Python здесь и легко смог изменить это для Юлии:

function bresenhams_line_algorithm(x1::Int, y1::Int, x2::Int, y2::Int)
# Calculate distances
dx = x2 - x1
dy = y2 - y1

# Determine how steep the line is
is_steep = abs(dy) > abs(dx)

# Rotate line
if is_steep == true
    x1, y1 = y1, x1
    x2, y2 = y2, x2
end

# Swap start and end points if necessary and store swap state
swapped = false
if x1 > x2
    x1, x2 = x2, x1
    y1, y2 = y2, y1
    swapped = true
end
# Recalculate differentials
dx = x2 - x1
dy = y2 - y1

# Calculate error
error = round(Int, dx/2.0)

if y1 < y2
    ystep = 1
else
    ystep = -1
end

# Iterate over bounding box generating points between start and end
y = y1
points = []
for x in x1:(x2+1)
    if is_steep == true
        coord = (y, x)
    else
        coord = (x, y)
    end
    push!(points,coord)
    error -= abs(dy)

    if error < 0
        y += ystep
        error += dx
    end
end

# Reverse the list if the coordinates were swapped
if swapped == true
    points = points[end:-1:1]
end

    return points
end

# Small test
x1 = 0
y1 = 0
x2 = 5
y2 = 5

points = bresenhams_line_algorithm(x1, y1, x2, y2)
person lara    schedule 27.10.2016
comment
Рад, что смог помочь. Красивый алгоритм, не так ли? :) - person Tasos Papastylianou; 28.10.2016