440 lines
14 KiB
Python
440 lines
14 KiB
Python
|
# vim: set fileencoding=utf-8 :
|
||
|
import pytest
|
||
|
|
||
|
import pyvips
|
||
|
from helpers import assert_almost_equal_objects
|
||
|
|
||
|
|
||
|
class TestCreate:
|
||
|
def test_black(self):
|
||
|
im = pyvips.Image.black(100, 100)
|
||
|
|
||
|
assert im.width == 100
|
||
|
assert im.height == 100
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
assert im.bands == 1
|
||
|
for i in range(0, 100):
|
||
|
pixel = im(i, i)
|
||
|
assert len(pixel) == 1
|
||
|
assert pixel[0] == 0
|
||
|
|
||
|
im = pyvips.Image.black(100, 100, bands=3)
|
||
|
|
||
|
assert im.width == 100
|
||
|
assert im.height == 100
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
assert im.bands == 3
|
||
|
for i in range(0, 100):
|
||
|
pixel = im(i, i)
|
||
|
assert len(pixel) == 3
|
||
|
assert_almost_equal_objects(pixel, [0, 0, 0])
|
||
|
|
||
|
def test_buildlut(self):
|
||
|
M = pyvips.Image.new_from_array([[0, 0],
|
||
|
[255, 100]])
|
||
|
lut = M.buildlut()
|
||
|
assert lut.width == 256
|
||
|
assert lut.height == 1
|
||
|
assert lut.bands == 1
|
||
|
p = lut(0, 0)
|
||
|
assert p[0] == 0.0
|
||
|
p = lut(255, 0)
|
||
|
assert p[0] == 100.0
|
||
|
p = lut(10, 0)
|
||
|
assert p[0] == 100 * 10.0 / 255.0
|
||
|
|
||
|
M = pyvips.Image.new_from_array([[0, 0, 100],
|
||
|
[255, 100, 0],
|
||
|
[128, 10, 90]])
|
||
|
lut = M.buildlut()
|
||
|
assert lut.width == 256
|
||
|
assert lut.height == 1
|
||
|
assert lut.bands == 2
|
||
|
p = lut(0, 0)
|
||
|
assert_almost_equal_objects(p, [0.0, 100.0])
|
||
|
p = lut(64, 0)
|
||
|
assert_almost_equal_objects(p, [5.0, 95.0])
|
||
|
|
||
|
def test_eye(self):
|
||
|
im = pyvips.Image.eye(100, 90)
|
||
|
assert im.width == 100
|
||
|
assert im.height == 90
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
assert im.max() == 1.0
|
||
|
assert im.min() == -1.0
|
||
|
|
||
|
im = pyvips.Image.eye(100, 90, uchar=True)
|
||
|
assert im.width == 100
|
||
|
assert im.height == 90
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
assert im.max() == 255.0
|
||
|
assert im.min() == 0.0
|
||
|
|
||
|
def test_fractsurf(self):
|
||
|
im = pyvips.Image.fractsurf(100, 90, 2.5)
|
||
|
assert im.width == 100
|
||
|
assert im.height == 90
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
def test_gaussmat(self):
|
||
|
im = pyvips.Image.gaussmat(1, 0.1)
|
||
|
assert im.width == 5
|
||
|
assert im.height == 5
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.DOUBLE
|
||
|
assert im.max() == 20
|
||
|
total = im.avg() * im.width * im.height
|
||
|
scale = im.get("scale")
|
||
|
assert total == scale
|
||
|
p = im(im.width / 2, im.height / 2)
|
||
|
assert p[0] == 20.0
|
||
|
|
||
|
im = pyvips.Image.gaussmat(1, 0.1,
|
||
|
separable=True, precision="float")
|
||
|
assert im.width == 5
|
||
|
assert im.height == 1
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.DOUBLE
|
||
|
assert im.max() == 1.0
|
||
|
total = im.avg() * im.width * im.height
|
||
|
scale = im.get("scale")
|
||
|
assert total == scale
|
||
|
p = im(im.width / 2, im.height / 2)
|
||
|
assert p[0] == 1.0
|
||
|
|
||
|
def test_gaussnoise(self):
|
||
|
im = pyvips.Image.gaussnoise(100, 90)
|
||
|
assert im.width == 100
|
||
|
assert im.height == 90
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
im = pyvips.Image.gaussnoise(100, 90, sigma=10, mean=100)
|
||
|
assert im.width == 100
|
||
|
assert im.height == 90
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
sigma = im.deviate()
|
||
|
mean = im.avg()
|
||
|
|
||
|
assert pytest.approx(sigma, 0.2) == 10
|
||
|
assert pytest.approx(mean, 0.2) == 100
|
||
|
|
||
|
def test_grey(self):
|
||
|
im = pyvips.Image.grey(100, 90)
|
||
|
assert im.width == 100
|
||
|
assert im.height == 90
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
p = im(0, 0)
|
||
|
assert p[0] == 0.0
|
||
|
p = im(99, 0)
|
||
|
assert p[0] == 1.0
|
||
|
p = im(0, 89)
|
||
|
assert p[0] == 0.0
|
||
|
p = im(99, 89)
|
||
|
assert p[0] == 1.0
|
||
|
|
||
|
im = pyvips.Image.grey(100, 90, uchar=True)
|
||
|
assert im.width == 100
|
||
|
assert im.height == 90
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
|
||
|
p = im(0, 0)
|
||
|
assert p[0] == 0
|
||
|
p = im(99, 0)
|
||
|
assert p[0] == 255
|
||
|
p = im(0, 89)
|
||
|
assert p[0] == 0
|
||
|
p = im(99, 89)
|
||
|
assert p[0] == 255
|
||
|
|
||
|
def test_identity(self):
|
||
|
im = pyvips.Image.identity()
|
||
|
assert im.width == 256
|
||
|
assert im.height == 1
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
|
||
|
p = im(0, 0)
|
||
|
assert p[0] == 0.0
|
||
|
p = im(255, 0)
|
||
|
assert p[0] == 255.0
|
||
|
p = im(128, 0)
|
||
|
assert p[0] == 128.0
|
||
|
|
||
|
im = pyvips.Image.identity(ushort=True)
|
||
|
assert im.width == 65536
|
||
|
assert im.height == 1
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.USHORT
|
||
|
|
||
|
p = im(0, 0)
|
||
|
assert p[0] == 0
|
||
|
p = im(99, 0)
|
||
|
assert p[0] == 99
|
||
|
p = im(65535, 0)
|
||
|
assert p[0] == 65535
|
||
|
|
||
|
def test_invertlut(self):
|
||
|
lut = pyvips.Image.new_from_array([[0.1, 0.2, 0.3, 0.1],
|
||
|
[0.2, 0.4, 0.4, 0.2],
|
||
|
[0.7, 0.5, 0.6, 0.3]])
|
||
|
im = lut.invertlut()
|
||
|
assert im.width == 256
|
||
|
assert im.height == 1
|
||
|
assert im.bands == 3
|
||
|
assert im.format == pyvips.BandFormat.DOUBLE
|
||
|
|
||
|
p = im(0, 0)
|
||
|
assert_almost_equal_objects(p, [0, 0, 0])
|
||
|
p = im(255, 0)
|
||
|
assert_almost_equal_objects(p, [1, 1, 1])
|
||
|
p = im(0.2 * 255, 0)
|
||
|
assert pytest.approx(p[0], 0.1) == 0.1
|
||
|
p = im(0.3 * 255, 0)
|
||
|
assert pytest.approx(p[1], 0.1) == 0.1
|
||
|
p = im(0.1 * 255, 0)
|
||
|
assert pytest.approx(p[2], 0.1) == 0.1
|
||
|
|
||
|
def test_logmat(self):
|
||
|
im = pyvips.Image.logmat(1, 0.1)
|
||
|
assert im.width == 7
|
||
|
assert im.height == 7
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.DOUBLE
|
||
|
assert im.max() == 20
|
||
|
total = im.avg() * im.width * im.height
|
||
|
scale = im.get("scale")
|
||
|
assert total == scale
|
||
|
p = im(im.width / 2, im.height / 2)
|
||
|
assert p[0] == 20.0
|
||
|
|
||
|
im = pyvips.Image.logmat(1, 0.1,
|
||
|
separable=True, precision="float")
|
||
|
assert im.width == 7
|
||
|
assert im.height == 1
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.DOUBLE
|
||
|
assert im.max() == 1.0
|
||
|
total = im.avg() * im.width * im.height
|
||
|
scale = im.get("scale")
|
||
|
assert total == scale
|
||
|
p = im(im.width / 2, im.height / 2)
|
||
|
assert p[0] == 1.0
|
||
|
|
||
|
def test_mask_butterworth_band(self):
|
||
|
im = pyvips.Image.mask_butterworth_band(128, 128, 2,
|
||
|
0.5, 0.5, 0.7,
|
||
|
0.1)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
assert pytest.approx(im.max(), 0.01) == 1
|
||
|
p = im(32, 32)
|
||
|
assert p[0] == 1.0
|
||
|
|
||
|
im = pyvips.Image.mask_butterworth_band(128, 128, 2,
|
||
|
0.5, 0.5, 0.7,
|
||
|
0.1, uchar=True, optical=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
assert im.max() == 255
|
||
|
p = im(32, 32)
|
||
|
assert p[0] == 255.0
|
||
|
p = im(64, 64)
|
||
|
assert p[0] == 255.0
|
||
|
|
||
|
im = pyvips.Image.mask_butterworth_band(128, 128, 2,
|
||
|
0.5, 0.5, 0.7,
|
||
|
0.1, uchar=True, optical=True,
|
||
|
nodc=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
assert im.max() == 255
|
||
|
p = im(32, 32)
|
||
|
assert p[0] == 255.0
|
||
|
p = im(64, 64)
|
||
|
assert p[0] != 255
|
||
|
|
||
|
def test_mask_butterworth(self):
|
||
|
im = pyvips.Image.mask_butterworth(128, 128, 2, 0.7, 0.1,
|
||
|
nodc=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
assert pytest.approx(im.min(), 0.01) == 0
|
||
|
p = im(0, 0)
|
||
|
assert p[0] == 0.0
|
||
|
v, x, y = im.maxpos()
|
||
|
assert x == 64
|
||
|
assert y == 64
|
||
|
|
||
|
im = pyvips.Image.mask_butterworth(128, 128, 2, 0.7, 0.1,
|
||
|
optical=True, uchar=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
assert pytest.approx(im.min(), 0.01) == 0
|
||
|
p = im(64, 64)
|
||
|
assert p[0] == 255
|
||
|
|
||
|
def test_mask_butterworth_ring(self):
|
||
|
im = pyvips.Image.mask_butterworth_ring(128, 128, 2, 0.7, 0.1, 0.5,
|
||
|
nodc=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
p = im(45, 0)
|
||
|
assert pytest.approx(p[0], 0.0001) == 1.0
|
||
|
v, x, y = im.minpos()
|
||
|
assert x == 64
|
||
|
assert y == 64
|
||
|
|
||
|
def test_mask_fractal(self):
|
||
|
im = pyvips.Image.mask_fractal(128, 128, 2.3)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
def test_mask_gaussian_band(self):
|
||
|
im = pyvips.Image.mask_gaussian_band(128, 128, 0.5, 0.5, 0.7, 0.1)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
assert pytest.approx(im.max(), 0.01) == 1
|
||
|
p = im(32, 32)
|
||
|
assert p[0] == 1.0
|
||
|
|
||
|
def test_mask_gaussian(self):
|
||
|
im = pyvips.Image.mask_gaussian(128, 128, 0.7, 0.1,
|
||
|
nodc=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
assert pytest.approx(im.min(), 0.01) == 0
|
||
|
p = im(0, 0)
|
||
|
assert p[0] == 0.0
|
||
|
|
||
|
def test_mask_gaussian_ring(self):
|
||
|
im = pyvips.Image.mask_gaussian_ring(128, 128, 0.7, 0.1, 0.5,
|
||
|
nodc=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
p = im(45, 0)
|
||
|
assert pytest.approx(p[0], 0.001) == 1.0
|
||
|
|
||
|
def test_mask_ideal_band(self):
|
||
|
im = pyvips.Image.mask_ideal_band(128, 128, 0.5, 0.5, 0.7)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
assert pytest.approx(im.max(), 0.01) == 1
|
||
|
p = im(32, 32)
|
||
|
assert p[0] == 1.0
|
||
|
|
||
|
def test_mask_ideal(self):
|
||
|
im = pyvips.Image.mask_ideal(128, 128, 0.7,
|
||
|
nodc=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
assert pytest.approx(im.min(), 0.01) == 0
|
||
|
p = im(0, 0)
|
||
|
assert p[0] == 0.0
|
||
|
|
||
|
def test_mask_gaussian_ring_2(self):
|
||
|
im = pyvips.Image.mask_ideal_ring(128, 128, 0.7, 0.5,
|
||
|
nodc=True)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
p = im(45, 0)
|
||
|
assert pytest.approx(p[0], 0.001) == 1.0
|
||
|
|
||
|
def test_sines(self):
|
||
|
im = pyvips.Image.sines(128, 128)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
@pytest.mark.skipif(pyvips.type_find("VipsOperation", "text") == 0,
|
||
|
reason="no text, skipping test")
|
||
|
def test_text(self):
|
||
|
im = pyvips.Image.text("Hello, world!")
|
||
|
assert im.width > 10
|
||
|
assert im.height > 10
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.UCHAR
|
||
|
assert im.max() == 255
|
||
|
assert im.min() == 0
|
||
|
|
||
|
def test_tonelut(self):
|
||
|
im = pyvips.Image.tonelut()
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.USHORT
|
||
|
assert im.width == 32768
|
||
|
assert im.height == 1
|
||
|
assert im.hist_ismonotonic()
|
||
|
|
||
|
def test_xyz(self):
|
||
|
im = pyvips.Image.xyz(128, 128)
|
||
|
assert im.bands == 2
|
||
|
assert im.format == pyvips.BandFormat.UINT
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
p = im(45, 35)
|
||
|
assert_almost_equal_objects(p, [45, 35])
|
||
|
|
||
|
def test_zone(self):
|
||
|
im = pyvips.Image.zone(128, 128)
|
||
|
assert im.width == 128
|
||
|
assert im.height == 128
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
@pytest.mark.skipif(pyvips.type_find("VipsOperation", "worley") == 0,
|
||
|
reason="no worley, skipping test")
|
||
|
def test_worley(self):
|
||
|
im = pyvips.Image.worley(512, 512)
|
||
|
assert im.width == 512
|
||
|
assert im.height == 512
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
@pytest.mark.skipif(pyvips.type_find("VipsOperation", "perlin") == 0,
|
||
|
reason="no perlin, skipping test")
|
||
|
def test_perlin(self):
|
||
|
im = pyvips.Image.perlin(512, 512)
|
||
|
assert im.width == 512
|
||
|
assert im.height == 512
|
||
|
assert im.bands == 1
|
||
|
assert im.format == pyvips.BandFormat.FLOAT
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
pytest.main()
|