2016-10-26 1 views
3

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

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

Мой код выглядит следующим образом до сих пор:

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 и некоторые должности обработки изображений на здесь и блоги и т.д., но я не могу показаться, чтобы получить эту работу.

То, что я (игнорировать цвета) An image which I convert to greyscale То, что я хочу (игнорировать цвета) Greyscale version of this

+1

взгляните на [алгоритм линии Брешенема] (https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm) –

ответ

5

Благодаря Тасос Papastylianou я нашел код Python here и легко смог изменить его для Юли:

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) 
+0

Рад, что я мог бы помочь. Это красивый алгоритм, не так ли? :) –