ruby-vips 0.3.14 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +22 -0
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +15 -0
  5. data/Gemfile.lock +46 -31
  6. data/{LICENSE → LICENSE.txt} +1 -1
  7. data/README.md +101 -145
  8. data/Rakefile +45 -0
  9. data/TODO +8 -32
  10. data/VERSION +1 -0
  11. data/example/annotate.rb +17 -0
  12. data/example/daltonize8.rb +75 -0
  13. data/example/example1.rb +84 -0
  14. data/example/example2.rb +31 -0
  15. data/example/example3.rb +19 -0
  16. data/example/example4.rb +18 -0
  17. data/example/example5.rb +31 -0
  18. data/example/trim8.rb +41 -0
  19. data/example/watermark.rb +44 -0
  20. data/example/wobble.rb +36 -0
  21. data/lib/vips.rb +151 -14
  22. data/lib/vips/access.rb +14 -0
  23. data/lib/vips/align.rb +11 -0
  24. data/lib/vips/angle.rb +12 -0
  25. data/lib/vips/angle45.rb +16 -0
  26. data/lib/vips/argument.rb +163 -0
  27. data/lib/vips/bandformat.rb +20 -0
  28. data/lib/vips/call.rb +302 -0
  29. data/lib/vips/coding.rb +14 -0
  30. data/lib/vips/demandstyle.rb +35 -0
  31. data/lib/vips/direction.rb +11 -0
  32. data/lib/vips/error.rb +30 -0
  33. data/lib/vips/extend.rb +22 -0
  34. data/lib/vips/foreignflags.rb +20 -0
  35. data/lib/vips/image.rb +1382 -0
  36. data/lib/vips/interpolate.rb +37 -0
  37. data/lib/vips/interpretation.rb +28 -0
  38. data/lib/vips/methods.rb +1807 -0
  39. data/lib/vips/operation.rb +19 -0
  40. data/ruby-vips8.gemspec +112 -0
  41. data/spec/image_spec.rb +515 -0
  42. data/spec/samples/balloon.v +0 -0
  43. data/spec/samples/ghost.ppm +405 -0
  44. data/spec/samples/huge.jpg +0 -0
  45. data/spec/samples/icc.jpg +0 -0
  46. data/spec/samples/lcd.icc +0 -0
  47. data/spec/samples/lion.svg +154 -0
  48. data/spec/samples/sample.csv +7 -0
  49. data/spec/samples/sample.exr +0 -0
  50. data/spec/samples/wagon.jpg +0 -0
  51. data/spec/samples/wagon.v +0 -0
  52. data/spec/spec_helper.rb +49 -0
  53. data/spec/vips_spec.rb +74 -0
  54. metadata +110 -70
  55. data/ext/extconf.rb +0 -31
  56. data/ext/header.c +0 -457
  57. data/ext/header.h +0 -9
  58. data/ext/image.c +0 -629
  59. data/ext/image.h +0 -72
  60. data/ext/image_arithmetic.c +0 -936
  61. data/ext/image_arithmetic.h +0 -38
  62. data/ext/image_boolean.c +0 -301
  63. data/ext/image_boolean.h +0 -8
  64. data/ext/image_colour.c +0 -590
  65. data/ext/image_colour.h +0 -36
  66. data/ext/image_conversion.c +0 -884
  67. data/ext/image_conversion.h +0 -38
  68. data/ext/image_convolution.c +0 -368
  69. data/ext/image_convolution.h +0 -13
  70. data/ext/image_freq_filt.c +0 -740
  71. data/ext/image_freq_filt.h +0 -27
  72. data/ext/image_histograms_lut.c +0 -643
  73. data/ext/image_histograms_lut.h +0 -28
  74. data/ext/image_morphology.c +0 -327
  75. data/ext/image_morphology.h +0 -13
  76. data/ext/image_mosaicing.c +0 -554
  77. data/ext/image_mosaicing.h +0 -15
  78. data/ext/image_relational.c +0 -384
  79. data/ext/image_relational.h +0 -8
  80. data/ext/image_resample.c +0 -249
  81. data/ext/image_resample.h +0 -9
  82. data/ext/interpolator.c +0 -106
  83. data/ext/interpolator.h +0 -7
  84. data/ext/mask.c +0 -347
  85. data/ext/mask.h +0 -18
  86. data/ext/reader.c +0 -261
  87. data/ext/reader.h +0 -2
  88. data/ext/ruby_vips.c +0 -188
  89. data/ext/ruby_vips.h +0 -72
  90. data/ext/tags +0 -450
  91. data/ext/writer.c +0 -371
  92. data/ext/writer.h +0 -2
  93. data/lib/vips/reader.rb +0 -272
  94. data/lib/vips/version.rb +0 -3
  95. data/lib/vips/writer.rb +0 -342
  96. data/ruby-vips.gemspec +0 -100
  97. data/ruby.supp +0 -134
@@ -1,38 +0,0 @@
1
- VALUE img_to_mask(VALUE);
2
- VALUE img_dup(VALUE);
3
- VALUE img_copy_swap(VALUE);
4
- VALUE img_copy_native(VALUE, VALUE);
5
- VALUE img_copy_file(VALUE);
6
- VALUE img_clip2fmt(VALUE, VALUE);
7
- VALUE img_scale(VALUE);
8
- VALUE img_msb(int, VALUE*, VALUE);
9
- VALUE img_c2amph(VALUE);
10
- VALUE img_c2rect(VALUE);
11
- VALUE img_ri2c(VALUE, VALUE);
12
- VALUE img_c2imag(VALUE);
13
- VALUE img_c2real(VALUE);
14
- VALUE img_scaleps(VALUE);
15
- VALUE img_falsecolour(VALUE);
16
- VALUE img_s_gaussnoise(VALUE, VALUE, VALUE, VALUE, VALUE);
17
- VALUE img_s_black(VALUE, VALUE, VALUE, VALUE);
18
- VALUE img_s_text(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
19
- VALUE img_extract_band(int, VALUE*, VALUE);
20
- VALUE img_extract_area(int, VALUE*, VALUE);
21
- VALUE img_embed(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
22
- VALUE img_tile_cache(VALUE, VALUE, VALUE, VALUE);
23
- VALUE img_bandjoin(int, VALUE *argv, VALUE);
24
- VALUE img_insert_noexpand(VALUE, VALUE, VALUE, VALUE);
25
- VALUE img_insert(int, VALUE *argv, VALUE);
26
- VALUE img_lrjoin(VALUE, VALUE);
27
- VALUE img_tbjoin(VALUE, VALUE);
28
- VALUE img_replicate(VALUE, VALUE, VALUE);
29
- VALUE img_grid(VALUE, VALUE, VALUE, VALUE);
30
- VALUE img_wrap(VALUE, VALUE, VALUE);
31
- VALUE img_fliphor(VALUE);
32
- VALUE img_flipver(VALUE);
33
- VALUE img_rot90(VALUE);
34
- VALUE img_rot180(VALUE);
35
- VALUE img_rot270(VALUE);
36
- VALUE img_subsample(int, VALUE*, VALUE);
37
- VALUE img_zoom(int, VALUE*, VALUE);
38
- void init_Image_conversion();
@@ -1,368 +0,0 @@
1
- #include "ruby_vips.h"
2
-
3
- /*
4
- * call-seq:
5
- * im.conv(mask) -> image
6
- *
7
- * Convolve *self* with <i>mask</i>. The output image always has the same band format
8
- * as *self*. Non-complex images only.
9
- *
10
- * Each output pixel is calculated as sigma[i]{pixel[i] * <i>mask</i>[i]} /
11
- * scale + offset, where scale and offset are part of <i>mask</i>. For integer
12
- * *self*, the division by scale includes round-to-nearest.
13
- *
14
- * <i>mask</i> can be an array in which case scale defaults to 1 and offset
15
- * defaults to zero. <i>mask</i> can also be a Mask object.
16
- */
17
-
18
- VALUE
19
- img_conv(VALUE obj, VALUE m)
20
- {
21
- DOUBLEMASK *dmask;
22
- INTMASK *imask;
23
-
24
- GetImg(obj, data, im);
25
- OutImg2(obj, m, new, data_new, im_new);
26
-
27
- mask_arg2mask(m, &imask, &dmask);
28
-
29
- if (imask) {
30
- if (im_conv(im, im_new, imask))
31
- vips_lib_error();
32
- } else if (im_conv_f(im, im_new, dmask))
33
- vips_lib_error();
34
-
35
- return new;
36
- }
37
-
38
- /*
39
- * call-seq:
40
- * im.convsep(mask) -> image
41
- *
42
- * Perform a separable convolution of *self* with <i>mask</i> using integer
43
- * arithmetic.
44
- *
45
- * <i>mask</i> must be 1xn or nx1 elements.
46
- *
47
- * The output image always has the same band format as *self*. Non-complex
48
- * images only.
49
- *
50
- * The image is convolved twice: once with <i>mask</i> and then again with
51
- * <i>mask</i> rotated by 90 degrees. This is much faster for certain types of
52
- * mask (gaussian blur, for example) than doing a full 2D convolution.
53
- *
54
- * Each output pixel is calculated as sigma[i]{pixel[i] * <i>mask</i>[i]} /
55
- * scale + offset, where scale and offset are part of <i>mask</i>. For integer
56
- * *self*, the division by scale includes round-to-nearest.
57
- *
58
- * <i>mask</i> can be an array in which case scale defaults to 1 and offset
59
- * defaults to zero. <i>mask</i> can also be a Mask object.
60
- */
61
-
62
- VALUE
63
- img_convsep(VALUE obj, VALUE mask)
64
- {
65
- DOUBLEMASK *dmask;
66
- INTMASK *imask;
67
-
68
- GetImg(obj, data, im);
69
- OutImg2(obj, mask, new, data_new, im_new);
70
-
71
- mask_arg2mask(mask, &imask, &dmask);
72
-
73
- if(imask) {
74
- if (im_convsep(im, im_new, imask))
75
- vips_lib_error();
76
- } else if (im_convsep_f(im, im_new, dmask))
77
- vips_lib_error();
78
-
79
- return new;
80
- }
81
-
82
- /*
83
- * call-seq:
84
- * im.compass(mask) -> image
85
- *
86
- * *self* is convolved 8 times with <i>mask</i>, each time <i>mask</i> is
87
- * rotated by 45 degrees. Each output pixel is the largest absolute value of
88
- * the 8 convolutions.
89
- *
90
- * <i>mask</i> can be an array or a Mask object.
91
- */
92
-
93
- VALUE
94
- img_compass(VALUE obj, VALUE mask)
95
- {
96
- INTMASK *imask;
97
- GetImg(obj, data, im);
98
- OutImg2(obj, mask, new, data_new, im_new);
99
-
100
- mask_arg2mask(mask, &imask, NULL);
101
-
102
- if (im_compass(im, im_new, imask))
103
- vips_lib_error();
104
-
105
- return new;
106
- }
107
-
108
- /*
109
- * call-seq:
110
- * im.gradient(mask) -> image
111
- *
112
- * *self* is convolved with <i>mask</i> and with <i>mask</i> after a 90 degree
113
- * rotation. The result is the sum of the absolute value of the two
114
- * convolutions.
115
- *
116
- * <i>mask</i> can be an array or a Mask object.
117
- */
118
-
119
- VALUE
120
- img_gradient(VALUE obj, VALUE mask)
121
- {
122
- INTMASK *imask;
123
-
124
- GetImg(obj, data, im);
125
- OutImg2(obj, mask, new, data_new, im_new);
126
-
127
- mask_arg2mask(mask, &imask, NULL);
128
-
129
- if (im_gradient(im, im_new, imask) )
130
- vips_lib_error();
131
-
132
- return new;
133
- }
134
-
135
- /*
136
- * call-seq:
137
- * im.lindetect(mask) -> image
138
- *
139
- * *self* is convolved four times with @mask, each time @mask is rotated by 45
140
- * degrees. Each output pixel is the largest absolute value of the four
141
- * convolutions.
142
- *
143
- * <i>mask</i> can be an array or a Mask object.
144
- */
145
-
146
- VALUE
147
- img_lindetect(VALUE obj, VALUE mask)
148
- {
149
- INTMASK *imask;
150
-
151
- GetImg(obj, data, im);
152
- OutImg2(obj, mask, new, data_new, im_new);
153
-
154
- mask_arg2mask(mask, &imask, NULL);
155
-
156
- if (im_lindetect(im, im_new, imask))
157
- vips_lib_error();
158
-
159
- return new;
160
- }
161
-
162
- /*
163
- * call-seq:
164
- * im.sharpen(mask_size, x1, y2, y3, m1, m2) -> image
165
- *
166
- * Selectively sharpen the L channel of a LAB image. Works for :LABQ coding and
167
- * LABS images.
168
- *
169
- * The operation performs a gaussian blur of size <i>mask_size</i> and
170
- * subtract from *self* to generate a high-frequency signal. This signal is
171
- * passed through a lookup table formed from the five parameters and added back
172
- * to *self*.
173
- *
174
- *
175
- * For printing, we recommend the following settings:
176
- *
177
- * mask_size == 7
178
- * x1 == 1.5
179
- * y2 == 20 (don't brighten by more than 20 L*)
180
- * y3 == 50 (can darken by up to 50 L*)
181
- *
182
- * m1 == 1 (some sharpening in flat areas)
183
- * m2 == 2 (more sharpening in jaggy areas)
184
- *
185
- * If you want more or less sharpening, we suggest you just change the
186
- * <i>m1</i> and <i>m2</i> parameters.
187
- *
188
- * The <i>mask_size</i> parameter changes the width of the fringe and can be
189
- * adjusted according to the output printing resolution. As an approximate
190
- * guideline, use 3 for 4 pixels/mm (CRT display resolution), 5 for 8
191
- * pixels/mm, 7 for 12 pixels/mm and 9 for 16 pixels/mm (300 dpi == 12
192
- * pixels/mm). These figures refer to the image raster, not the half-tone
193
- * resolution.
194
- */
195
-
196
- VALUE
197
- img_sharpen(VALUE obj, VALUE mask_size, VALUE x1, VALUE y2, VALUE y3, VALUE m1,
198
- VALUE m2)
199
- {
200
- GetImg(obj, data, im);
201
- OutImg(obj, new, data_new, im_new);
202
-
203
- if (im_sharpen(im, im_new, NUM2INT(mask_size), NUM2DBL(x1), NUM2DBL(y2),
204
- NUM2DBL(y3), NUM2DBL(m1), NUM2DBL(m2)))
205
- vips_lib_error();
206
-
207
- return new;
208
- }
209
-
210
- /*
211
- * call-seq:
212
- * im.grad_x -> image
213
- *
214
- * Find horizontal differences between adjacent pixels.
215
- *
216
- * Generates an image where the value of each pixel is the difference between
217
- * it and the pixel to its right. The output has the same height as the input
218
- * and one pixel less width. One-band integer formats only. The result is
219
- * always band format :INT.
220
- *
221
- * This operation is much faster than (though equivalent to) Image#conv with
222
- * the mask [[-1, 1]].
223
- */
224
-
225
- VALUE
226
- img_grad_x(VALUE obj)
227
- {
228
- RUBY_VIPS_UNARY(im_grad_x);
229
- }
230
-
231
- /*
232
- * call-seq:
233
- * im.grad_y -> image
234
- *
235
- * Find vertical differences between adjacent pixels.
236
- *
237
- * Generates an image where the value of each pixel is the difference between
238
- * it and the pixel below it. The output has the same width as the input
239
- * and one pixel less height. One-band integer formats only. The result is
240
- * always band format :INT.
241
- *
242
- * This operation is much faster than (though equivalent to) Image#conv with
243
- * the mask [[-1], [1]].
244
- */
245
-
246
- VALUE
247
- img_grad_y(VALUE obj)
248
- {
249
- RUBY_VIPS_UNARY(im_grad_y);
250
- }
251
-
252
- /*
253
- * call-seq:
254
- * im.fastcor(other_image) -> image
255
- *
256
- * Calculate a fast correlation surface.
257
- *
258
- * <i>other_image</i> is placed at every position in *self* and the sum of
259
- * squares of differences calculated. One-band, 8-bit unsigned images only. The
260
- * output image is always band format :UINT. <i>other_image</i> must be smaller
261
- * than or equal to *self*. The output image is the same size as the input.
262
- */
263
-
264
- VALUE
265
- img_fastcor(VALUE obj, VALUE obj2)
266
- {
267
- RUBY_VIPS_BINARY(im_fastcor);
268
- }
269
-
270
- /*
271
- * call-seq:
272
- * im.spcor(other_image) -> image
273
- *
274
- * Calculate a correlation surface.
275
- *
276
- * <i>other_image</i> is placed at every position in *self* and the correlation
277
- * coefficient calculated. One-band, 8 or 16-bit images only. *self* and
278
- * <i>other_image</i> must have the same band format.. The output image is
279
- * always band format :FLOAT. <i>other_image</i> must be smaller than or equal
280
- * to *self*. The output image is the same size as *self*.
281
- *
282
- * The correlation coefficient is calculated as:
283
- *
284
- * sumij (ref(i,j)-mean(ref))(inkl(i,j)-mean(inkl))
285
- * c(k,l) = ------------------------------------------------
286
- * sqrt(sumij (ref(i,j)-mean(ref))^2) *
287
- * sqrt(sumij (inkl(i,j)-mean(inkl))^2)
288
- *
289
- * where inkl is the area of *self* centred at position (k,l).
290
- *
291
- * from Niblack "An Introduction to Digital Image Processing", Prentice/Hall,
292
- * pp 138.
293
- */
294
-
295
- VALUE
296
- img_spcor(VALUE obj, VALUE obj2)
297
- {
298
- RUBY_VIPS_BINARY(im_spcor);
299
- }
300
-
301
- /*
302
- * call-seq:
303
- * im.gradcor(other_image) -> image
304
- *
305
- * Calculate a correlation surface.
306
- *
307
- * <i>other_image</i> is placed at every position in *self* and a correlation
308
- * coefficient calculated. One-band, integer images only. *self* and
309
- * <i>other_image</i> must have the same band format. The output image is
310
- * always band format :FLOAT. <i>other_image</i> must be smaller than *self*.
311
- * The output image is the same size as the input.
312
- *
313
- * The method takes the gradient images of the two images then takes the
314
- * dot-product correlation of the two vector images. The vector expression of
315
- * this method is my (tcv) own creation. It is equivalent to the complex-number
316
- * method of:
317
- *
318
- * ARGYRIOU, V. et al. 2003. Estimation of sub-pixel motion using gradient
319
- * cross correlation. Electronics Letters, 39 (13).
320
- */
321
-
322
- VALUE
323
- img_gradcor(VALUE obj, VALUE obj2)
324
- {
325
- RUBY_VIPS_BINARY(im_gradcor);
326
- }
327
-
328
- /*
329
- * call-seq:
330
- * im.contrast_surface(half_win_size, spacing) -> image
331
- *
332
- * Generate an image where the value of each pixel represents the contrast
333
- * within a window of half_win_size from the corresponsing point in the input
334
- * image. Sub-sample by a factor of spacing.
335
- */
336
-
337
- VALUE
338
- img_contrast_surface(VALUE obj, VALUE half_win_size, VALUE spacing)
339
- {
340
- GetImg(obj, data, im);
341
- OutImg(obj, new, data_new, im_new);
342
-
343
- if (im_contrast_surface(im, im_new, NUM2INT(half_win_size),
344
- NUM2INT(spacing)))
345
- vips_lib_error();
346
-
347
- return new;
348
- }
349
-
350
- /*
351
- * call-seq:
352
- * im.addgnoise(sigma) -> image
353
- *
354
- * Add gaussian noise with mean 0 and variance sigma to *self*. The noise is
355
- * generated by averaging 12 random numbers, see page 78, PIETGEN, 1989.
356
- */
357
-
358
- VALUE
359
- img_addgnoise(VALUE obj, VALUE sigma)
360
- {
361
- GetImg(obj, data, im);
362
- OutImg(obj, new, data_new, im_new);
363
-
364
- if (im_addgnoise(im, im_new, NUM2INT(sigma)))
365
- vips_lib_error();
366
-
367
- return new;
368
- }
@@ -1,13 +0,0 @@
1
- VALUE img_conv(VALUE, VALUE);
2
- VALUE img_convsep(VALUE, VALUE);
3
- VALUE img_compass(VALUE, VALUE);
4
- VALUE img_gradient(VALUE, VALUE);
5
- VALUE img_lindetect(VALUE, VALUE);
6
- VALUE img_sharpen(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
7
- VALUE img_grad_x(VALUE);
8
- VALUE img_grad_y(VALUE);
9
- VALUE img_fastcor(VALUE, VALUE);
10
- VALUE img_spcor(VALUE, VALUE);
11
- VALUE img_gradcor(VALUE, VALUE);
12
- VALUE img_contrast_surface(VALUE, VALUE, VALUE);
13
- VALUE img_addgnoise(VALUE, VALUE);
@@ -1,740 +0,0 @@
1
- #include "ruby_vips.h"
2
-
3
- /*
4
- * call-seq:
5
- * im.fwfft -> image
6
- *
7
- * Transform an image to Fourier space.
8
- *
9
- * VIPS uses the fftw3 or fftw2 Fourier transform libraries if possible. If
10
- * they were not available when VIPS was built, it falls back to its own
11
- * FFT functions which are slow and only work for square images whose sides
12
- * are a power of two.
13
- */
14
-
15
- VALUE
16
- img_fwfft(VALUE obj)
17
- {
18
- RUBY_VIPS_UNARY(im_fwfft);
19
- }
20
-
21
- /*
22
- * call-seq:
23
- * im.invfft -> image
24
- *
25
- * Transform an image from Fourier space to real space. The result is complex.
26
- * If you are OK with a real result, use Image#invfftr instead, it's quicker.
27
- *
28
- * VIPS uses the fftw3 or fftw2 Fourier transform libraries if possible. If
29
- * they were not available when VIPS was built, it falls back to its own FFT
30
- * functions which are slow and only work for square images whose sides are a
31
- * power of two.
32
- */
33
-
34
- VALUE
35
- img_invfft(VALUE obj)
36
- {
37
- RUBY_VIPS_UNARY(im_invfft);
38
- }
39
-
40
- /*
41
- * call-seq:
42
- * im.rotquad -> image
43
- *
44
- * Rotate the quadrants of the image so that the point that was at the
45
- * top-left is now in the centre. Handy for moving Fourier images to optical
46
- * space.
47
- */
48
-
49
- VALUE
50
- img_rotquad(VALUE obj)
51
- {
52
- RUBY_VIPS_UNARY(im_rotquad);
53
- }
54
-
55
- /*
56
- * call-seq:
57
- * im.invfftr -> image
58
- *
59
- * Transform an image from Fourier space to real space, giving a real result.
60
- * This is faster than Image#invfft, which gives a complex result.
61
- *
62
- * VIPS uses the fftw3 or fftw2 Fourier transform libraries if possible. If
63
- * they were not available when VIPS was built, it falls back to it's own
64
- * FFT functions which are slow and only work for square images whose sides
65
- * are a power of two.
66
- */
67
-
68
- VALUE
69
- img_invfftr(VALUE obj)
70
- {
71
- RUBY_VIPS_UNARY(im_invfftr);
72
- }
73
-
74
- #if ATLEAST_VIPS( 7, 22 )
75
-
76
- /*
77
- * call-seq:
78
- * Image.fmask_ideal_lowpass(x, y, frequency_cutoff) -> image
79
- *
80
- * This operation creates a one-band float image of the size <i>x</i> by
81
- * <i>y</i>. The image must be square, and the sides must be a power of two.
82
- * The image has values in the range [0, 1] and is typically used for
83
- * multiplying against frequency domain images to filter them.
84
- *
85
- * All masks are created with the DC component at (0, 0), so you might want to
86
- * rotate the quadrants with im_rotquad() before viewing. The DC pixel always
87
- * has the value 1.0.
88
- *
89
- * Unless noted below, all parameters are expressed as percentages, scaled to
90
- * [0, 1].
91
- *
92
- * * High-pass, low-pass masks: A high pass filter mask filters the low
93
- * frequencies while allowing the high frequencies to get through.
94
- * The reverse happens with a low pass filter mask.
95
- *
96
- * * Ring-pass, ring-reject masks: A ring filter passes or rejects a range of
97
- * frequencies. The range is specified by the <i>frequency_cutoff</i> and
98
- * the <i>width</i>.
99
- *
100
- * * Band-pass, band-reject masks: These masks are used to pass or remove
101
- * spatial frequencies around a given frequency. The position of the
102
- * frequency to pass or remove is given by <i>frequency_cutoffx</i> and
103
- * <i>frequency_cutoffy</i>. The size of the region around the point is
104
- * given by <i>radius</i>.
105
- *
106
- * * Ideal filters: These filters pass or reject frequencies with a sharp
107
- * cutoff at the transition.
108
- *
109
- * * Butterworth filters: These filters use a Butterworth function to separate
110
- * the frequencies (see Gonzalez and Wintz, Digital Image Processing, 1987).
111
- * The shape of the curve is controlled by <i>order</i>: higher values give
112
- * a sharper transition.
113
- *
114
- * * Gaussian filters: These filters have a smooth Gaussian shape,
115
- * controlled by <i>amplitude_cutoff</i>.
116
- */
117
-
118
- VALUE
119
- img_s_fmask_ideal_highpass(VALUE obj, VALUE x, VALUE y, VALUE frequency_cutoff)
120
- {
121
- OutPartial(new, data, im);
122
-
123
- if (im_create_fmask(im, NUM2INT(x), NUM2INT(y), VIPS_MASK_IDEAL_HIGHPASS,
124
- NUM2DBL(frequency_cutoff)))
125
- vips_lib_error();
126
-
127
- return new;
128
- }
129
-
130
- /*
131
- * call-seq:
132
- * Image.fmask_ideal_lowpass(x, y, frequency_cutoff) -> image
133
- *
134
- * See Image.fmask_ideal_highpass
135
- *
136
- */
137
-
138
- VALUE
139
- img_s_fmask_ideal_lowpass(VALUE obj, VALUE x, VALUE y, VALUE frequency_cutoff)
140
- {
141
- OutPartial(new, data, im);
142
-
143
- if (im_create_fmask(im, NUM2INT(x), NUM2INT(y),
144
- VIPS_MASK_IDEAL_LOWPASS, NUM2DBL(frequency_cutoff)))
145
- vips_lib_error();
146
-
147
- return new;
148
- }
149
-
150
- /*
151
- * call-seq:
152
- * Image.fmask_butterworth_highpass(x, y, order, frequency_cutoff,
153
- * amplitude_cutoff) -> image
154
- *
155
- * See Image.fmask_ideal_highpass
156
- */
157
-
158
- VALUE
159
- img_s_fmask_butterworth_highpass(VALUE obj, VALUE x, VALUE y,
160
- VALUE order, VALUE frequency_cutoff, VALUE amplitude_cutoff)
161
- {
162
- OutPartial(new, data, im);
163
-
164
- if (im_create_fmask(im,
165
- NUM2INT(x), NUM2INT(y), VIPS_MASK_BUTTERWORTH_HIGHPASS, NUM2DBL(order),
166
- NUM2DBL(frequency_cutoff), NUM2DBL(amplitude_cutoff)))
167
- vips_lib_error();
168
-
169
- return new;
170
- }
171
-
172
- /*
173
- * call-seq:
174
- * Image.fmask_butterworth_lowpass(x, y, order, frequency_cutoff,
175
- * amplitude_cutoff)
176
- *
177
- * See Image.fmask_ideal_highpass
178
- */
179
-
180
- VALUE
181
- img_s_fmask_butterworth_lowpass(VALUE obj, VALUE x, VALUE y,
182
- VALUE order, VALUE frequency_cutoff, VALUE amplitude_cutoff)
183
- {
184
- OutPartial(new, data, im);
185
-
186
- if (im_create_fmask(im,
187
- NUM2INT(x), NUM2INT(y), VIPS_MASK_BUTTERWORTH_LOWPASS, NUM2DBL(order),
188
- NUM2DBL(frequency_cutoff), NUM2DBL(amplitude_cutoff)))
189
- vips_lib_error();
190
-
191
- return new;
192
- }
193
-
194
- /*
195
- * call-seq:
196
- * Image.fmask_gauss_highpass(x, y, frequency_cutoff, amplitude_cutoff) ->
197
- * image
198
- *
199
- * See Image.fmask_ideal_highpass
200
- */
201
-
202
- VALUE
203
- img_s_fmask_gauss_highpass(VALUE obj, VALUE x, VALUE y,
204
- VALUE frequency_cutoff, VALUE amplitude_cutoff)
205
- {
206
- OutPartial(new, data, im);
207
-
208
- if (im_create_fmask(im,
209
- NUM2INT(x), NUM2INT(y), VIPS_MASK_GAUSS_HIGHPASS,
210
- NUM2DBL(frequency_cutoff), NUM2DBL(amplitude_cutoff)))
211
- vips_lib_error();
212
-
213
- return new;
214
- }
215
-
216
- /*
217
- * call-seq:
218
- * Image.fmask_gauss_lowpass(x, y, frequency_cutoff, amplitude_cutoff) ->
219
- * image
220
- *
221
- * See Image.fmask_ideal_highpass
222
- */
223
-
224
- VALUE
225
- img_s_fmask_gauss_lowpass(VALUE obj, VALUE x, VALUE y,
226
- VALUE frequency_cutoff, VALUE amplitude_cutoff)
227
- {
228
- OutPartial(new, data, im);
229
-
230
- if (im_create_fmask(im,
231
- NUM2INT(x), NUM2INT(y), VIPS_MASK_GAUSS_LOWPASS,
232
- NUM2DBL(frequency_cutoff), NUM2DBL(amplitude_cutoff)))
233
- vips_lib_error();
234
-
235
- return new;
236
- }
237
-
238
- /*
239
- * call-seq:
240
- * Image.fmask_ideal_ringpass(x, y, frequency_cutoff, width) -> image
241
- *
242
- * See Image.fmask_ideal_highpass
243
- */
244
-
245
- VALUE
246
- img_s_fmask_ideal_ringpass(VALUE obj, VALUE x, VALUE y,
247
- VALUE frequency_cutoff, VALUE width)
248
- {
249
- OutPartial(new, data, im);
250
-
251
- if (im_create_fmask(im,
252
- NUM2INT(x), NUM2INT(y), VIPS_MASK_IDEAL_RINGPASS,
253
- NUM2DBL(frequency_cutoff), NUM2DBL(width)))
254
- vips_lib_error();
255
-
256
- return new;
257
- }
258
-
259
- /*
260
- * call-seq:
261
- * Image.fmask_ideal_ringreject(x, y, frequency_cutoff, width) -> image
262
- *
263
- * See Image.fmask_ideal_highpass
264
- */
265
-
266
- VALUE
267
- img_s_fmask_ideal_ringreject(VALUE obj, VALUE x, VALUE y,
268
- VALUE frequency_cutoff, VALUE width)
269
- {
270
- OutPartial(new, data, im);
271
-
272
- if (im_create_fmask(im,
273
- NUM2INT(x), NUM2INT(y), VIPS_MASK_IDEAL_RINGREJECT,
274
- NUM2DBL(frequency_cutoff), NUM2DBL(width)))
275
- vips_lib_error();
276
-
277
- return new;
278
- }
279
-
280
- /*
281
- * call-seq:
282
- * Image.fmask_butterworth_ringpass(x, y, order, frequency_cutoff,
283
- * width, amplitude_cutoff) -> image
284
- *
285
- * See Image.fmask_ideal_highpass
286
- */
287
-
288
- VALUE
289
- img_s_fmask_butterworth_ringpass(VALUE obj, VALUE x, VALUE y,
290
- VALUE order, VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
291
- {
292
- OutPartial(new, data, im);
293
-
294
- if (im_create_fmask(im,
295
- NUM2INT(x), NUM2INT(y), VIPS_MASK_BUTTERWORTH_RINGPASS,
296
- NUM2DBL(order), NUM2DBL(frequency_cutoff), NUM2DBL(width),
297
- NUM2DBL(amplitude_cutoff)))
298
- vips_lib_error();
299
-
300
- return new;
301
- }
302
-
303
- /*
304
- * call-seq:
305
- * Image.fmask_butterworth_ringreject(x, y, order, frequency_cutoff,
306
- * width, amplitude_cutoff) -> image
307
- *
308
- * See Image.fmask_ideal_highpass
309
- */
310
-
311
- VALUE
312
- img_s_fmask_butterworth_ringreject(VALUE obj, VALUE x, VALUE y,
313
- VALUE order, VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
314
- {
315
- OutPartial(new, data, im);
316
-
317
- if (im_create_fmask(im,
318
- NUM2INT(x), NUM2INT(y), VIPS_MASK_BUTTERWORTH_RINGREJECT,
319
- NUM2DBL(order), NUM2DBL(frequency_cutoff), NUM2DBL(width),
320
- NUM2DBL(amplitude_cutoff)))
321
- vips_lib_error();
322
-
323
- return new;
324
- }
325
-
326
- /*
327
- * call-seq:
328
- * Image.fmask_gauss_ringpass(x, y, frequency_cutoff, width,
329
- * amplitude_cutoff) -> image
330
- *
331
- * See Image.fmask_ideal_highpass
332
- */
333
-
334
- VALUE
335
- img_s_fmask_gauss_ringpass(VALUE obj, VALUE x, VALUE y,
336
- VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
337
- {
338
- OutPartial(new, data, im);
339
-
340
- if (im_create_fmask(im,
341
- NUM2INT(x), NUM2INT(y), VIPS_MASK_GAUSS_RINGPASS,
342
- NUM2DBL(frequency_cutoff), NUM2DBL(width), NUM2DBL(amplitude_cutoff)))
343
- vips_lib_error();
344
-
345
- return new;
346
- }
347
-
348
- /*
349
- * call-seq:
350
- * Image.fmask_gauss_ringreject(x, y, frequency_cutoff, width,
351
- * amplitude_cutoff) -> image
352
- *
353
- * See Image.fmask_ideal_highpass
354
- */
355
-
356
- VALUE
357
- img_s_fmask_gauss_ringreject(VALUE obj, VALUE x, VALUE y,
358
- VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
359
- {
360
- OutPartial(new, data, im);
361
-
362
- if (im_create_fmask(im,
363
- NUM2INT(x), NUM2INT(y), VIPS_MASK_GAUSS_RINGREJECT,
364
- NUM2DBL(frequency_cutoff), NUM2DBL(width), NUM2DBL(amplitude_cutoff)))
365
- vips_lib_error();
366
-
367
- return new;
368
- }
369
-
370
- /*
371
- * call-seq:
372
- * Image.fmask_ideal_bandpass(x, y, frequency_cutoffx, frequency_cutoffy,
373
- * radius) -> image
374
- *
375
- * See Image.fmask_ideal_highpass
376
- */
377
-
378
- VALUE
379
- img_s_fmask_ideal_bandpass(VALUE obj, VALUE x, VALUE y,
380
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius)
381
- {
382
- OutPartial(new, data, im);
383
-
384
- if (im_create_fmask(im,
385
- NUM2INT(x), NUM2INT(y), VIPS_MASK_IDEAL_BANDPASS,
386
- NUM2DBL(frequency_cutoffx), NUM2DBL(frequency_cutoffy),
387
- NUM2DBL(radius)))
388
- vips_lib_error();
389
-
390
- return new;
391
- }
392
-
393
- /*
394
- * call-seq:
395
- * Image.fmask_ideal_bandreject(x, y, frequency_cutoffx, frequency_cutoffy,
396
- * radius)
397
- *
398
- * See Image.fmask_ideal_highpass
399
- */
400
-
401
- VALUE
402
- img_s_fmask_ideal_bandreject(VALUE obj, VALUE x, VALUE y,
403
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius)
404
- {
405
- OutPartial(new, data, im);
406
-
407
- if (im_create_fmask(im,
408
- NUM2INT(x), NUM2INT(y), VIPS_MASK_IDEAL_BANDREJECT,
409
- NUM2DBL(frequency_cutoffx), NUM2DBL(frequency_cutoffy),
410
- NUM2DBL(radius)))
411
- vips_lib_error();
412
-
413
- return new;
414
- }
415
-
416
- /*
417
- * call-seq:
418
- * Image.fmask_butterworth_bandpass(x, y, order, frequency_cutoffx,
419
- * frequency_cutoffy, radius, amplitude_cutoff) -> image
420
- *
421
- * See Image.fmask_ideal_highpass
422
- */
423
-
424
- VALUE
425
- img_s_fmask_butterworth_bandpass(VALUE obj, VALUE x, VALUE y,
426
- VALUE order, VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
427
- VALUE amplitude_cutoff)
428
- {
429
- OutPartial(new, data, im);
430
-
431
- if (im_create_fmask(im,
432
- NUM2INT(x), NUM2INT(y), VIPS_MASK_BUTTERWORTH_BANDPASS,
433
- NUM2DBL(order), NUM2DBL(frequency_cutoffx), NUM2DBL(frequency_cutoffy),
434
- NUM2DBL(radius), NUM2DBL(amplitude_cutoff)))
435
- vips_lib_error();
436
-
437
- return new;
438
- }
439
-
440
- /*
441
- * call-seq:
442
- * Image.fmask_butterworth_bandreject(x, y, order, frequency_cutoffx,
443
- * frequency_cutoffy, radius, amplitude_cutoff) -> image
444
- *
445
- * See Image.fmask_ideal_highpass
446
- */
447
-
448
- VALUE
449
- img_s_fmask_butterworth_bandreject(VALUE obj, VALUE x, VALUE y,
450
- VALUE order, VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
451
- VALUE amplitude_cutoff)
452
- {
453
- OutPartial(new, data, im);
454
-
455
- if (im_create_fmask(im,
456
- NUM2INT(x), NUM2INT(y), VIPS_MASK_BUTTERWORTH_BANDREJECT,
457
- NUM2DBL(order), NUM2DBL(frequency_cutoffx), NUM2DBL(frequency_cutoffy),
458
- NUM2DBL(radius), NUM2DBL(amplitude_cutoff)))
459
- vips_lib_error();
460
-
461
- return new;
462
- }
463
-
464
- /*
465
- * call-seq:
466
- * Image.fmask_gaus_bandpass(x, y, frequency_cutoffx, frequency_cutoffy,
467
- * radius, amplitude_cutoff) -> image
468
- *
469
- * See Image.fmask_ideal_highpass
470
- */
471
-
472
- VALUE
473
- img_s_fmask_gauss_bandpass(VALUE obj, VALUE x, VALUE y,
474
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
475
- VALUE amplitude_cutoff)
476
- {
477
- OutPartial(new, data, im);
478
-
479
- if (im_create_fmask(im,
480
- NUM2INT(x), NUM2INT(y), VIPS_MASK_GAUSS_BANDPASS,
481
- NUM2DBL(frequency_cutoffx), NUM2DBL(frequency_cutoffy), NUM2DBL(radius),
482
- NUM2DBL(amplitude_cutoff)))
483
- vips_lib_error();
484
-
485
- return new;
486
- }
487
-
488
- /*
489
- * call-seq:
490
- * Image.fmask_gauss_bandreject, x, y, frequency_cutoffx, frequency_cutoffy,
491
- * radius, amplitude_cutoff) -> image
492
- *
493
- * See Image.fmask_ideal_highpass
494
- */
495
-
496
- VALUE
497
- img_s_fmask_gauss_bandreject(VALUE obj, VALUE x, VALUE y,
498
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
499
- VALUE amplitude_cutoff)
500
- {
501
- OutPartial(new, data, im);
502
-
503
- if (im_create_fmask(im,
504
- NUM2INT(x), NUM2INT(y), VIPS_MASK_GAUSS_BANDREJECT,
505
- NUM2DBL(frequency_cutoffx), NUM2DBL(frequency_cutoffy), NUM2DBL(radius),
506
- NUM2DBL(amplitude_cutoff)))
507
- vips_lib_error();
508
-
509
- return new;
510
- }
511
-
512
- /*
513
- * call-seq:
514
- * Image.fmask_fractal_flt(x, y, fractal_dimension) -> image
515
- *
516
- * This mask is handy for filtering images of gaussian noise in order to create
517
- * surfaces of a given fractal dimension. @fractal_dimension should be between
518
- * 2 and 3.
519
- */
520
-
521
- VALUE
522
- img_s_fmask_fractal_flt(VALUE obj, VALUE x, VALUE y,
523
- VALUE fractal_dimension)
524
- {
525
- OutPartial(new, data, im);
526
-
527
- if (im_create_fmask(im,
528
- NUM2INT(x), NUM2INT(y), VIPS_MASK_FRACTAL_FLT,
529
- NUM2DBL(fractal_dimension)))
530
- vips_lib_error();
531
-
532
- return new;
533
- }
534
-
535
- #else
536
-
537
- VALUE
538
- img_s_fmask_ideal_highpass(VALUE obj, VALUE x, VALUE y,
539
- VALUE frequency_cutoff)
540
- {
541
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
542
- }
543
-
544
- VALUE
545
- img_s_fmask_ideal_lowpass(VALUE obj, VALUE x, VALUE y,
546
- VALUE frequency_cutoff)
547
- {
548
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
549
- }
550
-
551
- VALUE
552
- img_s_fmask_butterworth_highpass(VALUE obj, VALUE x, VALUE y,
553
- VALUE order, VALUE frequency_cutoff, VALUE amplitude_cutoff)
554
- {
555
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
556
- }
557
-
558
- VALUE
559
- img_s_fmask_butterworth_lowpass(VALUE obj, VALUE x, VALUE y,
560
- VALUE order, VALUE frequency_cutoff, VALUE amplitude_cutoff)
561
- {
562
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
563
- }
564
-
565
- VALUE
566
- img_s_fmask_gauss_highpass(VALUE obj, VALUE x, VALUE y,
567
- VALUE frequency_cutoff, VALUE amplitude_cutoff)
568
- {
569
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
570
- }
571
-
572
- VALUE
573
- img_s_fmask_gauss_lowpass(VALUE obj, VALUE x, VALUE y,
574
- VALUE frequency_cutoff, VALUE amplitude_cutoff)
575
- {
576
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
577
- }
578
-
579
- VALUE
580
- img_s_fmask_ideal_ringpass(VALUE obj, VALUE x, VALUE y,
581
- VALUE frequency_cutoff, VALUE width)
582
- {
583
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
584
- }
585
-
586
- VALUE
587
- img_s_fmask_ideal_ringreject(VALUE obj, VALUE x, VALUE y,
588
- VALUE frequency_cutoff, VALUE width)
589
- {
590
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
591
- }
592
-
593
- VALUE
594
- img_s_fmask_butterworth_ringpass(VALUE obj, VALUE x, VALUE y,
595
- VALUE order, VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
596
- {
597
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
598
- }
599
-
600
- VALUE
601
- img_s_fmask_butterworth_ringreject(VALUE obj, VALUE x, VALUE y,
602
- VALUE order, VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
603
- {
604
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
605
- }
606
-
607
- VALUE
608
- img_s_fmask_gauss_ringpass(VALUE obj, VALUE x, VALUE y,
609
- VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
610
- {
611
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
612
- }
613
-
614
- VALUE
615
- img_s_fmask_gauss_ringreject(VALUE obj, VALUE x, VALUE y,
616
- VALUE frequency_cutoff, VALUE width, VALUE amplitude_cutoff)
617
- {
618
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
619
- }
620
-
621
- VALUE
622
- img_s_fmask_ideal_bandpass(VALUE obj, VALUE x, VALUE y,
623
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius)
624
- {
625
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
626
- }
627
-
628
- VALUE
629
- img_s_fmask_ideal_bandreject(VALUE obj, VALUE x, VALUE y,
630
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius)
631
- {
632
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
633
- }
634
-
635
- VALUE
636
- img_s_fmask_butterworth_bandpass(VALUE obj, VALUE x, VALUE y,
637
- VALUE order, VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
638
- VALUE amplitude_cutoff)
639
- {
640
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
641
- }
642
-
643
- VALUE
644
- img_s_fmask_butterworth_bandreject(VALUE obj, VALUE x, VALUE y,
645
- VALUE order, VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
646
- VALUE amplitude_cutoff)
647
- {
648
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
649
- }
650
-
651
- VALUE
652
- img_s_fmask_gauss_bandpass(VALUE obj, VALUE x, VALUE y,
653
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
654
- VALUE amplitude_cutoff)
655
- {
656
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
657
- }
658
-
659
- VALUE
660
- img_s_fmask_gauss_bandreject(VALUE obj, VALUE x, VALUE y,
661
- VALUE frequency_cutoffx, VALUE frequency_cutoffy, VALUE radius,
662
- VALUE amplitude_cutoff)
663
- {
664
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
665
- }
666
-
667
- VALUE
668
- img_s_fmask_fractal_flt(VALUE obj, VALUE x, VALUE y,
669
- VALUE fractal_dimension)
670
- {
671
- rb_raise(eVIPSError, "Operation not supported with your version of VIPS.");
672
- }
673
-
674
- #endif
675
-
676
- /*
677
- * call-seq:
678
- * im.freqflt(other_image) -> image
679
- *
680
- * Filter an image in Fourier space.
681
- *
682
- * *self* is transformed to Fourier space, multipled with <i>other_image</i>,
683
- * then transformed back to real space. If *self* is already a complex image,
684
- * just multiply then inverse transform.
685
- */
686
-
687
- VALUE
688
- img_freqflt(VALUE obj, VALUE obj2)
689
- {
690
- RUBY_VIPS_BINARY(im_freqflt);
691
- }
692
-
693
- /*
694
- * call-seq:
695
- * im.disp_ps -> image
696
- *
697
- * Make a displayable (ie. 8-bit unsigned int) power spectrum.
698
- *
699
- * If *self* is non-complex, it is transformed to Fourier space. Then the
700
- * absolute value is passed through Image#scaleps, and Image#rotquad.
701
- */
702
-
703
- VALUE
704
- img_disp_ps(VALUE obj)
705
- {
706
- RUBY_VIPS_UNARY(im_disp_ps);
707
- }
708
-
709
- /*
710
- * call-seq:
711
- * im.phasecor_fft(other_image) -> image
712
- *
713
- * Convert the two input images to Fourier space, calculate phase-correlation,
714
- * back to real space.
715
- */
716
-
717
- VALUE
718
- img_phasecor_fft(VALUE obj, VALUE obj2)
719
- {
720
- RUBY_VIPS_BINARY(im_phasecor_fft);
721
- }
722
-
723
- /*
724
- * call-seq:
725
- * Image.fractsurf(size, frd) -> image
726
- *
727
- * Generate an image of size <i>size</i> and fractal dimension <i>frd</i>. The
728
- * dimension should be between 2 and 3.
729
- */
730
-
731
- VALUE
732
- img_s_fractsurf(VALUE obj, VALUE size, VALUE frd)
733
- {
734
- OutPartial(new, data, im);
735
-
736
- if (im_fractsurf(im, NUM2INT(size), NUM2DBL(frd)))
737
- vips_lib_error();
738
-
739
- return new;
740
- }