Image Quality Assessment
Pricing
from $5.00 / 1,000 results
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
Actor stats
0
Bookmarked
3
Total users
2
Monthly active users
8 days ago
Last modified
Categories
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:
- Sharpness Score: Uses Laplacian edge detection to measure image clarity. Higher variance indicates sharper images.
- Exposure Score: Analyzes luminance distribution. Optimal exposure centers around 50% brightness.
- Noise Score: Applies high-pass filtering to isolate and measure noise artifacts.
- 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
imageUrl | string | One of | - | Publicly accessible HTTP/HTTPS URL of the image |
imageBase64 | string | One of | - | Base64-encoded image data (raw or data URI format) |
config | object | No | See below | Quality threshold configuration |
Configuration Options
| Threshold | Default | Range | Description |
|---|---|---|---|
sharpness | 0.3 | 0-1 | Minimum sharpness score. Images below this are flagged as "blurry" |
exposure | 0.2 | 0-1 | Minimum exposure score. Images below this are flagged as "underexposed" or "overexposed" |
noise | 0.3 | 0-1 | Minimum noise quality score. Images below this are flagged as "noisy" |
contrast | 0.2 | 0-1 | Minimum 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
| Field | Type | Description |
|---|---|---|
pass | boolean | true if all metrics meet their thresholds, false otherwise |
score | number | Overall quality score (0-1), calculated as average of all metrics |
issues | array | List of detected quality issues |
scores | object | Individual scores for each quality metric (0-1) |
scores.sharpness | number | Sharpness/blur score (0=blurry, 1=sharp) |
scores.exposure | number | Exposure score (0=under/overexposed, 1=well-exposed) |
scores.noise | number | Noise quality score (0=noisy, 1=clean) |
scores.contrast | number | Contrast score (0=flat, 1=good dynamic range) |
configApplied | object | The threshold configuration used for analysis |
imageUrl | string | The analyzed image URL (if URL input was used) |
processedAt | string | ISO 8601 timestamp of when analysis completed |
demoMode | boolean | true if Actor ran with no input (demo mode) |
Possible Issues
The issues array can contain any combination of:
| Issue | Description |
|---|---|
blurry | Image sharpness is below the threshold |
underexposed | Image is too dark |
overexposed | Image is too bright |
noisy | Image has excessive noise/grain |
low_contrast | Image 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.
Print Production Quality Gates
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 ApifyClientclient = 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:
- Check the error messages in the run logs
- Verify your image URL is publicly accessible
- Ensure your base64 data is properly encoded
- Review the FAQ section above
For bug reports or feature requests, please contact the developer through Apify.
