Как обрезать круговое изображение до вписанного квадрата, затем обрезать до вписанного круга и, наконец, обрезать до вписанного квадрата? - PullRequest
0 голосов
/ 04 июля 2018

Я хотел бы обрезать круглое изображение, прикрепленное ниже, в соответствии со следующим:

  1. обрезать входное круглое изображение до уникального квадрата, вписанного в круг.
  2. обрезать квадратное изображение до круга, вписанного в квадрат
  3. обрезать круговое изображение с предыдущего шага вниз до квадрата с надписью изображения.

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

Я включил грубую визуализацию того, как я хотел бы обрезать его:

Кроме того, я включил исходное изображение:

Фрагмент кода с кратким объяснением был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Изображение, которое вы хотите обрезать, геометрически равно квадрату с центром на входном изображении, вдвое меньше . Это потому, что вы вписываете дважды, каждый раз, когда квадрат уменьшается на квадратный корень из двух, а деление на SQRT (2) дважды - это то же самое, что деление на 2.

Таким образом, если у вас есть квадрат ввода стороны D (или круглое изображение диаметра D), вам нужно обрезать с центром (D / 2, D / 2) и стороной D / 2.

0 голосов
/ 04 июля 2018

Вам не нужно выполнять промежуточный урожай.

Просто вычислите параметры квадрата результата.

Что-то вроде этого псевдокода (я лучше в с ++):

def calcSideOfInscribedSquare(current_size):
    return current_size / sqrt(2)

initial_side = min(image.cols, image.rows)
first_squre_side = calcSideOfInscribedSquare(initial_side)
second_square_side = calcSideOfInscribedSquare(first_squre_side)

cv.Rect result_square(
    image.cols / 2 - second_square_side / 2,
    image.rows / 2 - second_square_side / 2,
    second_square_side,
    second_square_side)

new_image = image(result_square)
...