Базовый алгоритм изменения размера 2D-матрицы

Допустим, у меня есть черно-белое изображение буквы «J», представленное в виде бинарной матрицы, вот так (белый = 0, черный = 1). Если мы допустим, что каждая ячейка в матрице является пикселем, ее размер будет 6 х 10.

0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0

Что я хочу сделать, так это взять это изображение и изменить его размер в 10 раз, то есть сделать его в 10 раз больше текущего размера, до 60 x 100. (Конечно, потребуется некоторая интерполяция, но в этом нет необходимости. быть слишком изощренным.)

Я пока не очень понимаю, как это делается на практике. Есть ли матрица преобразования, которая может справиться с этим? Я нашел статью, в которой говорится об использовании матрицы изменения размера (в моем случае 2 x 2, я думаю). Нужно ли мне применять это тогда? К каждому вектору (каждой записи) в матрице? И как мне тогда обработать интерполяцию для масштабирования черных пикселей?

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я буду использовать меньшую (5x4) версию вашего примера:

. . T .
. . I .
. . I .
L . I .
. V . .

и увеличьте его в 3 раза, умножив на матрицу 15x5 слева для масштабирования по вертикали и на матрицу 4x12 справа для масштабирования по горизонтали:

1 0 0 0 0     . . T .     1 1 1 0 0 0 0 0 0 0 0 0     . . . . . . T T T . . .
1 0 0 0 0  X  . . I .  X  0 0 0 1 1 1 0 0 0 0 0 0  =  . . . . . . T T T . . .
1 0 0 0 0     . . I .     0 0 0 0 0 0 1 1 1 0 0 0     . . . . . . T T T . . .
0 1 0 0 0     L . I .     0 0 0 0 0 0 0 0 0 1 1 1     . . . . . . I I I . . .
0 1 0 0 0     . V . .                                 . . . . . . I I I . . .
0 1 0 0 0                                             . . . . . . I I I . . .
0 0 1 0 0                                             . . . . . . I I I . . .
0 0 1 0 0                                             . . . . . . I I I . . .
0 0 1 0 0                                             . . . . . . I I I . . .
0 0 0 1 0                                             L L L . . . I I I . . .
0 0 0 1 0                                             L L L . . . I I I . . .
0 0 0 1 0                                             L L L . . . I I I . . .
0 0 0 0 1                                             . . . V V V . . . . . .
0 0 0 0 1                                             . . . V V V . . . . . .
0 0 0 0 1                                             . . . V V V . . . . . .

Я верю, что схема ясна.

О, круто, это действительно имеет смысл. Я не думал об использовании 2 матриц. Полтора вопроса: 1. почему вы выбрали положение единиц в матрицах масштабирования таким образом, как вы выбрали? 2. Предполагая, что матрица может иметь дроби в качестве значений, есть подсказки, как выполнять интерполяцию?

Max 20.03.2022 19:08

1. Я увидел, что одной матрицы масштабирования недостаточно, мне нужно было две, одну по вертикали и одну по горизонтали. Чтобы масштабировать матрицу mxn до строк km, мне понадобится левая матрица kmxm. Он должен сгенерировать k копий первой строки исходной матрицы, поэтому первые k строк левой матрицы должны быть 1 0 0 ...0. Дальше все пошло легко. 2. Есть много способов сделать это. Например, в моем примере каждый пиксель в оригинале сопоставляется с блоком пикселей 3x3; вы можете зафиксировать центральный пиксель и изменить восемь других, чтобы сделать плавный переход к соседним фиксированным центрам.

Beta 20.03.2022 19:42

Другие вопросы по теме