Image Quality Assessment avatar
Image Quality Assessment

Pricing

from $5.00 / 1,000 results

Go to Apify Store
Image Quality Assessment

Image Quality Assessment

Analyze image quality with local Sharp.js processing - no API key required. Evaluates sharpness, exposure, noise, and contrast to return pass/fail verdict with detailed quality scores. Perfect for e-commerce product photos, UGC validation, and photo library curation. $0.01 per image analyzed.

Pricing

from $5.00 / 1,000 results

Rating

0.0

(0)

Developer

Marielise

Marielise

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

8 days ago

Last modified

Share

Automatically analyze image quality by detecting blur, exposure problems, noise, and contrast issues. This Actor processes images locally using Sharp.js for fast, privacy-friendly quality scoring without requiring any external API keys. Perfect for automating image quality control workflows at scale.

Pricing: $0.01 per image analyzed (Pay Per Event)

Features

  • Blur Detection: Identifies out-of-focus or motion-blurred images using Laplacian variance analysis
  • Exposure Analysis: Detects underexposed (too dark) and overexposed (too bright) images
  • Noise Detection: Measures image noise levels using high-frequency analysis
  • Contrast Evaluation: Assesses dynamic range and tonal distribution
  • Configurable Thresholds: Customize sensitivity for each quality metric
  • Fast Processing: Analyzes images in seconds with no external API calls
  • Privacy-Friendly: All processing happens locally on Apify infrastructure
  • Multiple Input Formats: Supports URL input or base64-encoded image data

How It Works

The Actor uses computer vision algorithms powered by Sharp.js to analyze four key quality metrics:

  1. Sharpness Score: Uses Laplacian edge detection to measure image clarity. Higher variance indicates sharper images.
  2. Exposure Score: Analyzes luminance distribution. Optimal exposure centers around 50% brightness.
  3. Noise Score: Applies high-pass filtering to isolate and measure noise artifacts.
  4. Contrast Score: Evaluates standard deviation of luminance values to assess dynamic range.

Each metric produces a score from 0 to 1, where higher values indicate better quality. The overall score is the average of all four metrics.

Getting Started

Basic Usage

Simply provide an image URL to analyze:

{
"imageUrl": "https://example.com/photo.jpg"
}

The Actor will return quality scores and identify any issues found.

Using Base64 Input

For images not accessible via public URL, use base64-encoded data:

{
"imageBase64": "/9j/4AAQSkZJRgABAQEASABIAAD/..."
}

Data URI format is also supported:

{
"imageBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/..."
}

Custom Quality Thresholds

Adjust sensitivity by providing custom thresholds. Lower values are more permissive:

{
"imageUrl": "https://example.com/photo.jpg",
"config": {
"sharpness": 0.5,
"exposure": 0.3,
"noise": 0.4,
"contrast": 0.25
}
}

Set any threshold to 0 to skip that check entirely:

{
"imageUrl": "https://example.com/photo.jpg",
"config": {
"sharpness": 0.3,
"exposure": 0,
"noise": 0.3,
"contrast": 0
}
}

Input Parameters

ParameterTypeRequiredDefaultDescription
imageUrlstringOne of-Publicly accessible HTTP/HTTPS URL of the image
imageBase64stringOne of-Base64-encoded image data (raw or data URI format)
configobjectNoSee belowQuality threshold configuration

Configuration Options

ThresholdDefaultRangeDescription
sharpness0.30-1Minimum sharpness score. Images below this are flagged as "blurry"
exposure0.20-1Minimum exposure score. Images below this are flagged as "underexposed" or "overexposed"
noise0.30-1Minimum noise quality score. Images below this are flagged as "noisy"
contrast0.20-1Minimum contrast score. Images below this are flagged as "low_contrast"

Output Format

Successful Analysis

{
"pass": true,
"score": 0.72,
"issues": [],
"scores": {
"sharpness": 0.85,
"exposure": 0.92,
"noise": 0.65,
"contrast": 0.48
},
"configApplied": {
"sharpness": 0.3,
"exposure": 0.2,
"noise": 0.3,
"contrast": 0.2
},
"imageUrl": "https://example.com/photo.jpg",
"processedAt": "2024-01-15T10:30:00.000Z"
}

Failed Quality Check

{
"pass": false,
"score": 0.35,
"issues": ["blurry", "noisy"],
"scores": {
"sharpness": 0.15,
"exposure": 0.78,
"noise": 0.22,
"contrast": 0.45
},
"configApplied": {
"sharpness": 0.3,
"exposure": 0.2,
"noise": 0.3,
"contrast": 0.2
},
"imageUrl": "https://example.com/blurry-photo.jpg",
"processedAt": "2024-01-15T10:31:00.000Z"
}

Output Fields

FieldTypeDescription
passbooleantrue if all metrics meet their thresholds, false otherwise
scorenumberOverall quality score (0-1), calculated as average of all metrics
issuesarrayList of detected quality issues
scoresobjectIndividual scores for each quality metric (0-1)
scores.sharpnessnumberSharpness/blur score (0=blurry, 1=sharp)
scores.exposurenumberExposure score (0=under/overexposed, 1=well-exposed)
scores.noisenumberNoise quality score (0=noisy, 1=clean)
scores.contrastnumberContrast score (0=flat, 1=good dynamic range)
configAppliedobjectThe threshold configuration used for analysis
imageUrlstringThe analyzed image URL (if URL input was used)
processedAtstringISO 8601 timestamp of when analysis completed
demoModebooleantrue if Actor ran with no input (demo mode)

Possible Issues

The issues array can contain any combination of:

IssueDescription
blurryImage sharpness is below the threshold
underexposedImage is too dark
overexposedImage is too bright
noisyImage has excessive noise/grain
low_contrastImage lacks tonal range

Use Cases

E-Commerce Product Images

Automatically validate product photos before publishing to ensure consistent quality across your catalog. Reject blurry or poorly lit images that could hurt conversion rates.

User-Generated Content Moderation

Filter low-quality uploads in real-time. Set strict thresholds for professional platforms or relaxed thresholds for casual sharing.

Photo Library Curation

Bulk analyze thousands of photos to identify and remove duplicates or low-quality images. Perfect for photographers and media companies.

Ensure images meet minimum quality standards before sending to print. Prevent costly reprints due to blurry or noisy source files.

Automated Workflow Integration

Integrate with Apify webhooks or API to build automated image processing pipelines. Combine with other Actors for complete content workflows.

AI Training Data Preparation

Filter image datasets to ensure training data meets quality standards. Remove blurry, noisy, or poorly exposed images that could degrade model performance.

Technical Specifications

Supported Formats

  • JPEG / JPG
  • PNG
  • GIF (first frame)
  • BMP
  • WebP
  • TIFF

Limits

  • Maximum file size: 20MB per image
  • Minimum dimensions: No strict minimum, but very small images may produce unreliable scores
  • Processing time: Typically 1-3 seconds per image

Memory Requirements

  • Minimum: 256MB
  • Recommended: 512MB for large images
  • Maximum: 4096MB

Pricing

This Actor uses Pay Per Event (PPE) pricing:

  • $0.01 per image analyzed
  • Only charged for successful analyses
  • Failed analyses (invalid URL, corrupted image) are not charged
  • Demo mode runs are not charged

Error Handling

The Actor handles errors gracefully:

  • Invalid URL: Returns error message without crashing
  • Unreachable URL: Returns clear error about fetch failure
  • Invalid base64: Returns validation error message
  • Corrupted image: Returns processing error details

All errors are logged and returned in the dataset for debugging.

Integration Examples

Apify API

curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~image-quality-assessment/runs" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{"imageUrl": "https://example.com/photo.jpg"}'

JavaScript/Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('YOUR_USERNAME/image-quality-assessment').call({
imageUrl: 'https://example.com/photo.jpg',
config: { sharpness: 0.4 }
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run_input = {
"imageUrl": "https://example.com/photo.jpg",
"config": {"sharpness": 0.4}
}
run = client.actor("YOUR_USERNAME/image-quality-assessment").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

FAQ

Q: Can I analyze multiple images in one run? A: Currently, each run analyzes one image. For batch processing, use Apify's task scheduling or call the Actor multiple times via the API.

Q: Why is my image showing as "blurry" when it looks sharp to me? A: The default threshold of 0.3 is moderately strict. Try lowering the sharpness threshold to 0.2 or 0.15 for more lenient detection.

Q: Does this Actor support animated GIFs? A: Yes, but only the first frame is analyzed. For full animation quality assessment, consider extracting frames separately.

Q: How accurate is the quality detection? A: The algorithms are based on established computer vision techniques and perform well for typical photographic images. Results may vary for specialized content like medical imaging or satellite photos.

Q: Can I use this with private/authenticated images? A: Yes, use the imageBase64 input to provide the image data directly instead of a URL.

Support

If you encounter issues or have questions:

  1. Check the error messages in the run logs
  2. Verify your image URL is publicly accessible
  3. Ensure your base64 data is properly encoded
  4. Review the FAQ section above

For bug reports or feature requests, please contact the developer through Apify.