perceptual_hash — IMGFORENSICS hash op

• Data kinds: image2d → phash

• Call: import fullseye as fs; fs.ledger.perceptual_hash(image, mode: 'str' = 'dct', hash_size: 'int' = 8) -> 'np.ndarray' (implementation को सीधे call करना हो तो import imgforensics; imgforensics.perceptual_hash(image, mode: 'str' = 'dct', hash_size: 'int' = 8) -> 'np.ndarray', registry से लेना हो तो opsimgforensics.get("perceptual_hash"))

उपयोग

perceptual hash। bool की 1-D bit string लौटाता है।

mode:

"dct" (hash_size * 4) वर्ग तक downscale → 2-D DCT-II (orthogonal) → ऊपर-बाएँ का

hash_size x hash_size block लें और DC को छोड़कर median से तुलना करें।

Zauner 2010 के pHash जैसी ही प्रक्रिया। लंबाई hash_size**2 bits।

"average" hash_size वर्ग तक downscale → mean से तुलना (aHash)। समान लंबाई। "difference" (hash_size, hash_size + 1) तक downscale → तुलना करें कि क्षैतिज रूप से सटे pixels में कौन बड़ा है (dHash)। समान लंबाई, mean luminance में बदलाव के प्रति robust।

मापा गया (tests/test_imgforensics.py इसे संख्याओं में स्थिर करता है; 256x256 1/f^1.6 images, hash_size=8 = 64 bits। 2 असंबंधित images के बीच दूरी dct 31.3 / average 34.2 / difference 32.6 है (20 जोड़ियों का औसत; सैद्धांतिक मान 32 = bit length का आधा)):

===================== ======== ========== ============

रूपांतरण dct average difference

===================== ======== ========== ============

JPEG q60 पुनःसंपीड़न 0 0 0

JPEG q30 पुनःसंपीड़न 2 0 0

1/2 छोटा करना 0 0 0

1/4 छोटा करना 0 0 0

brightness +0.1 0 0 0

क्षैतिज flip 28 42 34

90 deg rotation 32 30 32

अलग image 28 40 34

===================== ======== ========== ============

यह op क्या नहीं बता सकता:

• छोटी दूरी का अर्थ समान image नहीं है। चूँकि यह मोटे 8x8 downscale तक गिर जाता है, बारीक detail की छेड़छाड़ दूरी 0 पर पास हो जाती है। मापा गया: 512x512 image में 24x24 copy-move डालने पर, दूरी dct 0 / average 0 / difference 1 है।

• न ही बड़ी दूरी का अर्थ अलग image है। जैसा ऊपर की table दिखाती है, flips और rotations को "अलग image" से अलग नहीं पहचाना जा सकता (दोनों 2 असंबंधित images जैसी ही दूरी की range में आते हैं)। geometric transforms के प्रति कोई invariance बिल्कुल नहीं है।

• return value phash vocabulary में है, signal में नहीं। bool 1-D array signal / indices / descriptor की सभी मौजूदा predicates को पूरा करता है, इसलिए गड़बड़ी होने पर signal1d.lowpass और अन्य finite, विश्वसनीय दिखने वाले मान लौटाते हैं (5 ops पर मापा गया)। इसी कारण hash_distance dtype जाँचता है।

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• image_forensics_audit — py -3.11 examples/image_forensics_audit.py

वे अगले ops जिनसे type जुड़ता है (phash को input के रूप में लेते हैं)

hash_distance · watermark_embed · watermark_capacity

इसी category के (hash)

hash_distance


*Provenance: imgforensics.py — IMGFORENSICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.