Допустим, у меня есть черно-белое изображение буквы «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, я думаю). Нужно ли мне применять это тогда? К каждому вектору (каждой записи) в матрице? И как мне тогда обработать интерполяцию для масштабирования черных пикселей?
Мне было интересно, может ли кто-нибудь предоставить простой пример того, как это работает с использованием матрицы масштабирования, или, может быть, дать мне некоторые подсказки, что искать. Мои поиски не увенчались успехом, чтобы найти простой/урезанный пример.
Я буду использовать меньшую (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. Предполагая, что матрица может иметь дроби в качестве значений, есть подсказки, как выполнять интерполяцию?
1. Я увидел, что одной матрицы масштабирования недостаточно, мне нужно было две, одну по вертикали и одну по горизонтали. Чтобы масштабировать матрицу mxn до строк km, мне понадобится левая матрица kmxm. Он должен сгенерировать k копий первой строки исходной матрицы, поэтому первые k строк левой матрицы должны быть 1 0 0 ...0
. Дальше все пошло легко. 2. Есть много способов сделать это. Например, в моем примере каждый пиксель в оригинале сопоставляется с блоком пикселей 3x3; вы можете зафиксировать центральный пиксель и изменить восемь других, чтобы сделать плавный переход к соседним фиксированным центрам.