Как случайно повернуть квадрат в 2D-массиве? - PullRequest
0 голосов
/ 12 января 2020

Моя задача обнаружить прямоугольник независимо от того, где он находится на картинке. Для этого я создал случайные пиксели и случайные квадраты на картинке. Он варьируется по форме и размеру.

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

То, что у меня сейчас есть:

enter image description here

Что я хочу:

enter image description here

Мой код для первого (прямого) участка:

plt.figure(figsize=(4, 4))
s = 100                                             # plot size (100, 100)
min = 10                                            # min rectangle height
max = 20                                            # max rectangle height

background = np.random.randint(0, 256, (s, s, 3))   # random background pixels

a = np.random.randint(min, max)                     # little side of rectangle
b = np.random.randint(a*1.5, a*2.5)                 # big side of rectangle

xx, yy = np.where(np.ones((a, b)) == 1)             # initial coordinates of the rectangle

cx = np.random.randint(0 + a, s - a)                # random horizontal location 
cy = np.random.randint(0 + a, s - b)                # random vertical location 

background[xx + cx, yy + cy] = np.random.randint(200, 255, background[xx + cx, 
    yy + cy].shape)

plt.imshow(background)
plt.xlim(0, s)
plt.ylim(0, s)
plt.title('Random Square')
plt.show()

Ответы [ 2 ]

1 голос
/ 12 января 2020

Поскольку ваше изображение заполнено случайными пикселями, я бы порекомендовал нарисовать прямоугольник в середине изображения, затем повернуть его (для этого используйте OpenCV, в частности cv2.getRotationMatrix2D() и cv2.warpAffine()), а затем перевести (смещение ) в некотором направлении, поэтому положение также становится случайным.

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

Если вам нужна дополнительная помощь с ротацией, вот ссылка с руководством: https://www.pyimagesearch.com/2017/01/02/rotate-images-correctly-with-opencv-and-python/

0 голосов
/ 12 января 2020

Ваша форма проста, но мне нравится использовать einsum для фигур с сотнями точек. Вы можете получить идею из этого. s00 - это просто многоугольник, представленный массивом ndarray ([[1.5, 1.5], [0.0, 10.0], [10.0, 10.0], [10.0, 0.0], [1.5, 1.5]])

angle = 22.5
angle = np.radians(angle)
c, s = np.cos(angle), np.sin(angle)
R = np.array(((c, s), (-s, c)))
cent = np.mean(s00, axis=0)
new_cent = [10., 10.]
ch = np.einsum('ij,jk->ik', s00 - cent, R) + new_cent

enter image description here

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