Пиксельные координаты от точки A до B - PullRequest
1 голос
/ 21 апреля 2020

У меня есть шкала серого 50 x 50 пикселей изображение в виде numpy 2D-массива. Каждый пиксель является координатой, начинающейся сверху слева [0, 0] справа внизу [50, 50] . Как получить координаты каждого пикселя, который находится на линии от точки A до B, где эти точки могут быть любыми заданными парами пикселей, то есть от A [19, 3] до B [4, 4] или от A [3, 12] до B [0, 33] Пример: линия от A [4, 9] до B [12, 30] пересекает какие пиксели?

Заранее спасибо
Эво

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Вы можете интерполировать ваше изображение для извлечения профиля линии, если вы именно так и поступите sh, поэтому координаты не обязательно должны быть целыми числами:

from scipy.ndimage import map_coordinates 
from skimage.data import coins 
from matplotlib import pyplot as plt 
import numpy as np

npts = 128 
rr = np.linspace(30, 243, npts) # coordinates of points defined here 
cc = np.linspace(73, 270, npts) 

image = coins() 
# this line extracts the line profile from the image 
profile = map_coordinates(image, np.stack((rr, cc))) 

# can visualise as 
fig, ax = plt.subplots(ncols=2) 
ax[0].matshow(image) 
ax[0].plot(cc, rr, 'w--') 
ax[1].plot(profile) # profile is the value in the image along the line

output

0 голосов
/ 26 апреля 2020

С строкой изображения scikit () , например:

import numpy as np
from skimage.draw import line
from skimage import io

# Create image
img = np.zeros((50, 50), dtype=np.uint8)

# Get row and col of pixels making line from (4,9) to (12,30)
rr, cc = line(4, 9, 12, 30)

print(rr)

array([ 4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  9,  9,  9, 10, 10,
   10, 11, 11, 12, 12])

print(cc)
array([ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   26, 27, 28, 29, 30])

# Visualise as image instead of list
img[rr, cc] = 255
io.imsave('result.jpg',img)

enter image description here

0 голосов
/ 26 апреля 2020

То, что я выяснил, помогает вычислить значение пикселя в точке занавеса на линии (вектор). Код ниже:

coordA = [0,0]
coordB = [3,4]


def intermid_pix(coorA, coorB, nb_points=8):
    x_axis = (coorB[0] - coorA[0]) / (nb_points + 1)
    y_axis = (coorB[1] - coorA[1]) / (nb_points + 1)
    rounded = [[round(coorA[0] + i * x_axis), round(coorA[1] + i * y_axis)]
              for i in range(1, nb_points + 1)]
    rounded_trim = []
    [rounded_trim.append(x) for x in rounded if x not in rounded_trim]
    return rounded_trim
coordinates = intermed_pix(coordA, coordB, nb_points=8)

print(coordinates)

выход:

[[0, 0], [1, 1], [1, 2], [2, 2], [2, 3], [3, 4]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...