Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to perform perspective distort transformation in VIPS?

Is it possible to do the following ImageMagick perspective distort command using VIPS? If so, what would the command be (using ruby-vips)?

$ convert my_file.png -matte -virtual-pixel transparent +distort Perspective '0,0,0,60 1500,0,300,0 0,2100,0,2310 1500,2100,300,2100' -crop 300x2310+0+0

like image 865
dignoe Avatar asked Jan 25 '26 14:01

dignoe


1 Answers

There isn't a built-in thing for perspective distort, but you can make one using mapim:

http://jcupitt.github.io/libvips/API/current/libvips-resample.html#vips-mapim

#!/usr/bin/ruby
  
require 'vips'

image = Vips::Image.new_from_file ARGV[0]

# perspective distortion: each pixel (x', y') in the output image is
# interpolated from pixel (x, y) in the input using:
#
#   x' = (A x + B y + C) / (G x + H y + 1)
#   y' = (D x + E y + F) / (G x + H y + 1)
#
# where the constants A .. H are from the transform matrix T
#
# T = [A, B, .. H]

T = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0003, 0.0001]

# make an index image where pixels have the value of their (x, y) coordinates
i = Vips::Image.xyz image.width, image.height

x = (i[0] * T[0] + i[1] * T[1] + T[2]) / (i[0] * T[6] + i[1] * T[7] + 1)
y = (i[0] * T[3] + i[1] * T[4] + T[5]) / (i[0] * T[6] + i[1] * T[7] + 1)

# join up x and y as a map image
m = x.bandjoin y

# and use it to transform our original image
image = image.mapim m 

image.write_to_file ARGV[1]

You'd also need something to calculate the transform from a set of tie-points, of course.

edit: fixed typo

like image 53
jcupitt Avatar answered Jan 27 '26 20:01

jcupitt



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!