как отслеживать местоположение пикселя после поворота изображения?

#python #opencv #image-processing #data-augmentation

#python #opencv #обработка изображений #увеличение данных

Вопрос:

Я пытаюсь случайным образом повернуть некоторые изображения с аннотациями, я пытаюсь понять, как получить новое местоположение точки после поворота, мои изображения имеют разные формы

Пример того, что я пытаюсь сделать: эта функция для вычисления новой позиции в соответствии с этим ответом (здесь)

 def new_pixel(x,y,theta,X,Y):
   sin = math.sin(theta)
   cos = math.cos(theta)
   x_new = (x-X/2)*cos   (y-X/2)*sin   X/2
   y_new = -(x-X/2)*sin   (y-Y/2)*cos   Y/2
   return int(x_new),int(y_new)
 

код открытого исходного изображения:

 img = cv2.imread('D://ubun/1.jpg')
print(img.shape)
X, Y, c = img.shape
p1 = (124,291)
p2 = (168,291)
p3 = (169,391)
p4 = (125,391)
img1 = img.copy()
cv2.circle(img1, p1, 10, color=(255,0,0), thickness=2)
plt.imshow(img1)
 

красная точка — это точка

изображение

код для поворота:

 rotated = ndimage.rotate(img, 45)
print(rotated.shape)
p11 = new_pixel(p1[0],p1[1],45,X,Y)
p22 = new_pixel(p2[0],p2[1],45,X,Y)
p33 = new_pixel(p3[0],p3[1],45,X,Y)
p44 = new_pixel(p4[0],p4[1],45,X,Y)
cv2.circle(rotated, p11, 10, color=(255,0,0), thickness=2)
plt.imshow(rotated)
 

Изображение после поворота и увидеть точку не в правильном положении после поворота:

Я заметил, что форма изображения меняется после поворота, влияет ли это на вычисления?

Комментарии:

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

2. Причина в том, что выходное изображение изменяет размер при повороте относительно входного изображения.

3. Ваш размер X / Y изменяется во время поворота, но ваше происхождение остается прежним (вверху слева). Вероятно, вам придется умножить вычисленные точки X и Y на отношение длин сторон двух изображений (соотношение ширины для X, высоты для Y). Просто мысль. Вы также вращаетесь вокруг точки (ширина / 2, высота / 2), вы можете вручную вычислить новую точку XY, просто выполнив базовую тригонометрию.

4. спасибо, я также думаю, что проблема заключается в форме изображения после поворота

5. Все еще нерешенный):