mirror of
https://github.com/lovell/sharp.git
synced 2026-02-08 07:36:16 +01:00
Add experimental 'attention' crop strategy
This commit is contained in:
39
test/saliency/humanae/download.js
Normal file
39
test/saliency/humanae/download.js
Normal file
@@ -0,0 +1,39 @@
|
||||
'use strict';
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const fs = require('fs');
|
||||
const request = require('request');
|
||||
const tumblr = require('tumblr.js');
|
||||
|
||||
const client = tumblr.createClient({
|
||||
consumer_key: '***',
|
||||
consumer_secret: '***'
|
||||
});
|
||||
|
||||
const fetchImages = function(offset) {
|
||||
console.log(`Fetching offset ${offset}`);
|
||||
client.posts('humanae', {
|
||||
type: 'photo',
|
||||
offset: offset
|
||||
}, function (err, response) {
|
||||
if (err) throw err;
|
||||
if (response.posts.length > 0) {
|
||||
response.posts.forEach((post) => {
|
||||
const url = post.photos[0].alt_sizes
|
||||
.filter((image) => image.width === 100)
|
||||
.map((image) => image.url)
|
||||
[0];
|
||||
const filename = `./images/${post.id}.jpg`;
|
||||
try {
|
||||
fs.statSync(filename);
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
request(url).pipe(fs.createWriteStream(filename));
|
||||
}
|
||||
}
|
||||
});
|
||||
fetchImages(offset + 20);
|
||||
}
|
||||
});
|
||||
};
|
||||
fetchImages(0);
|
||||
9
test/saliency/humanae/package.json
Normal file
9
test/saliency/humanae/package.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "sharp-crop-strategy-attention-model-humanae",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"request": "^2.75.0",
|
||||
"tumblr.js": "^1.1.1"
|
||||
}
|
||||
}
|
||||
34
test/saliency/humanae/tone.js
Normal file
34
test/saliency/humanae/tone.js
Normal file
@@ -0,0 +1,34 @@
|
||||
'use strict';
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const fs = require('fs');
|
||||
const child_process = require('child_process');
|
||||
|
||||
const a = [];
|
||||
const b = [];
|
||||
|
||||
fs.readdirSync('./images')
|
||||
.filter((file) => file.endsWith('.jpg'))
|
||||
.forEach((file) => {
|
||||
// Extract one pixel, avoiding first DCT block, and return value of A and B channels
|
||||
const command = `convert ./images/${file}[1x1+8+8] -colorspace lab -format "%[fx:u.g] %[fx:u.b]" info:`;
|
||||
const result = child_process.execSync(command, { encoding: 'utf8' });
|
||||
const ab = result.split(' ');
|
||||
a.push(ab[0]);
|
||||
b.push(ab[1]);
|
||||
});
|
||||
|
||||
a.sort((v1, v2) => v1 - v2);
|
||||
b.sort((v1, v2) => v1 - v2);
|
||||
|
||||
// Convert from 0..1 to -128..128
|
||||
const convert = function(v) {
|
||||
return Math.round(256 * (v - 0.5));
|
||||
};
|
||||
|
||||
const threshold = Math.round(a.length / 100);
|
||||
console.log(`Trimming lowest/highest ${threshold} for 98th percentile`);
|
||||
|
||||
// Ignore ~2% outliers
|
||||
console.log(`a ${convert(a[threshold])} - ${convert(a[a.length - threshold])}`);
|
||||
console.log(`b ${convert(b[threshold])} - ${convert(b[b.length - threshold])}`);
|
||||
Reference in New Issue
Block a user