Как добиться фотошопа, как деформация в Imagick - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь добиться фотошопа как деформации, используя магию изображений.Я попытался переместить начальные 16 точек на сетке 4х4 в последние 16 точек.у меня есть начальные 16 очков и последние 16 очков.

здесь точки - координаты x, y пересечения сетки.

Я использую искажение Шепардса.

convert d1s.png -matte -virtual-pixel transparent -distort Shepards "0,0 0,234  158,0 973,300  316,0 1120,367  474,0 1336,411  0,667 0,842  158,667 810,858  316,667 998,878 474,667 1130,898  0,1333 0,1370  158,1333 700,1396 316,1333 936,1411 474,1333 1084,1418  0,2000 0,1886  158,2000 936,1942  316,2000 1105,1945  474,2000 1321,1900" outputs.png

Это приводит к неожиданному искажению.

Если есть и другие способы, пожалуйста, поделитесь.

обновление:

входное изображение enter image description here

выходное изображение enter image description here

Я хочучтобы достичь чего-то вроде этого.У меня есть начальные 16 очков и последние 16 очков.

1 Ответ

0 голосов
/ 17 ноября 2018

Я обработал ваше изображение сетки, выбрав контрольные точки на пересечениях сетки на входном и выходном изображении из Photoshop.Я использовал плагин ImageJ pointpicker, чтобы помочь мне выбрать и сохранить контрольные точки.См. http://bigwww.epfl.ch/thevenaz/pointpicker/

Затем я использовал полиномиальную деформацию 2-го порядка ImageMagick, используя эти контрольные точки.

Я поместил список контрольных точек в массив для входных и выходных изображений.Затем я объединил их в формате in1 out1 in2 out2 ... in16 out16 (как соответствующие пары).

inArr=(17,20
280,22
542,21
806,20
16,286
280,286
542,286
808,285
17,549
280,549
542,550
805,549
17,812
280,812
542,812
806,808)


outArr=(348,13
420,41
522,48
582,66
277,302
328,320
409,346
481,360
230,516
332,548
442,569
516,552
289,748
402,776
542,766
638,713)

list="2"
for ((i=0; i<16; i++)); do
list="$list ${inArr[$i]} ${outArr[$i]}"
done
echo $list


2 17,20 348,13 280,22 420,41 542,21 522,48 806,20 582,66 16,286 277,302 280,286 328,320 542,286 409,346 808,285 481,360 17,549 230,516 280,549 332,548 542,550 442,569 805,549 516,552 17,812 289,748 280,812 402,776 542,812 542,766 806,808 638,713


Обратите внимание, что первая запись выше - 2, что означает, что контрольные точки будутподгонка к полиному 2-го порядка.

Далее, перед искажением, я сделал область вне линий сетки прозрачной, чтобы внешняя область не отображалась на искаженном изображении.Я сделал это, заливая внешнюю черную область прозрачностью (не окрашивая).Используется искажение -virtual-pixel none, чтобы все, что находится за пределами входного изображения, было прозрачным.

convert grid.png -fuzz 10% -fill none -draw "matte 0,0 floodfill" -virtual-pixel none -distort polynomial "$list" grid_warp2.png


enter image description here

Вот третьеупорядочить результаты полинома:

list="3"
for ((i=0; i<16; i++)); do
list="$list ${inArr[$i]} ${outArr[$i]}"
done
echo $list

3 17,20 348,13 280,22 420,41 542,21 522,48 806,20 582,66 16,286 277,302 280,286 328,320 542,286 409,346 808,285 481,360 17,549 230,516 280,549 332,548 542,550 442,569 805,549 516,552 17,812 289,748 280,812 402,776 542,812 542,766 806,808 638,713

convert grid.png -fuzz 10% -fill none -draw "matte 0,0 floodfill" -virtual-pixel none -distort polynomial "$list" grid_warp3.png


enter image description here

Больше контрольных точек может дать более близкий результат, чем в Photoshop.

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