V236 / OPERATING GUIDE先讀範圍,再決定增強副本能替你做什麼。
影像增強副本只在你的瀏覽器內處理圖片,不上傳、不使用瀏覽器儲存空間。本頁說明它做什麼、不做什麼、每個步驟的白話原理與參數建議、處理紀錄怎麼讀、如何自己動手驗證,以及最常被誤解的地方。
READ FIRST先說清楚這不是什麼
增強副本是「方便看的工作副本」,不是原始證據,也不會讓照片裡原本沒有的資訊長出來。
- 每個步驟都改變了像素。處理後「比較容易看」,不等於「比較接近事實」。銳化會製造邊緣光暈,去雜訊會抹掉細線與小字,區域對比會把雜訊放大成假紋理,放大只是補點、不增加資訊。
- 它不是還原,也不是鑑識。原圖沒有拍到的車牌、人臉、字跡,任何演算法都變不出來。看起來「浮現」的筆畫,可能只是被畫出來的假象。
- 處理紀錄只說明「做了什麼」。它不證明原圖內容真實,不是公證,也不是鑑定意見;紀錄裡的時間來自這台裝置的時鐘,未經第三方驗證;它是一般文字檔,任何人都能編輯。
- 請一定保留未經處理的原圖。交給他人或機關時,同時附上原圖、增強副本與處理紀錄,並說明副本經過處理。可以用證據鏈帳本為三者計算雜湊,再把封存碼交給第三方保存。
- 法律上能否採用、如何提出,須由律師或法院判斷。本工具不提供法律意見。
SCOPE做什麼、不做什麼
- 做什麼
- 在你的瀏覽器內讀取一張圖片(JPEG、PNG、WebP、GIF、BMP;AVIF 視瀏覽器而定)。檔案上限 25 MiB、約 40 百萬像素、每邊不超過 16384 px;超過時會說明原因,不會悄悄縮小。
- 提供 4 組預設與 17 種處理步驟(自動色階、亮度/對比、伽瑪、背景平整、陰影/亮部恢復、CLAHE、白平衡、去除色偏、三種去雜訊、反銳化、輕度去模糊、放大、傾斜微調、裁切、反相)。每個步驟都能開關、調整參數與順序。
- 預覽在長邊最多 1280 px 的縮圖上計算,可取消、有進度;滿意後再「套用到原尺寸」,在背景工作者內重新處理並產生副本。
- 「套用到原尺寸」有進度條,可隨時取消(按「取消處理」或 Esc),取消不會留下任何檔案;若背景工作者在 10 秒內沒有停下來(例如正在編碼輸出檔),頁面會強制中止它,並請你重新選取圖片。輸出超過 100 百萬像素、或預估記憶體超過保護上限時,會說明原因並拒絕執行,不會當機。
- 前後對照(滑桿或並排)、縮放與平移、1:1 像素檢視,以及處理前後的直方圖與統計。
- 輸出 PNG(無損)或 JPEG(有損,可選品質),檔名加上「_增強版」;同時產生 JSON 與 TXT 兩種處理紀錄。可選擇在影像左下角加註兩行文字(預設關閉,會改變像素)。
- 不做什麼
- 不上傳、不聯網、不使用任何瀏覽器儲存空間(含 cookie);關閉或重新整理頁面,畫面上的資料就消失。
- 不修改原圖;結果一律另存為新檔。
- 不辨識內容(不做人臉、車牌或文字辨識),不判斷圖片真偽或是否被修改過。
- 不使用機器學習模型,不「生成」細節。所有步驟都是公開、可重算的傳統影像運算。
- 不內建 HEIC 解碼(多數瀏覽器無法解碼);GIF 或動畫 WebP 只處理首張畫面;不處理 RAW。
- 輸出是重新編碼的新檔:不含原圖的 EXIF、位置資料與色彩描述檔;透明處壓平成白底。
STEPS IN PLAIN WORDS每個步驟在做什麼(白話)
下面依工具內的選單順序排列。每個步驟都附上「代價」:不是只有好處。順序也會影響結果,常見的順序是:先調亮度與色彩,再去雜訊,最後才銳化;要放大時,放大放在去雜訊之後、輕度銳化之前。
自動色階
- 原理
- 找出圖中最暗與最亮的一小撮像素(預設各 0.5 %),把它們拉到純黑 0 與純白 255,中間依比例拉開。像是把只用了一小段灰階的圖攤平到整個範圍。「只看亮度」時三個色彩通道用同一組端點,色相不變;「各色彩通道分開」則每個通道各自拉伸,順便壓掉偏色。
- 適合
- 整體發灰、偏暗但雜訊不重的圖;掃描件的泛黃底色(用各通道模式)。
- 代價
- 畫面裡有反光、燈泡等極端亮點時,端點會被它帶偏;各通道模式遇到本來就偏單色的場景(草地、藍牆)會把顏色拉歪。暗部的雜訊也會一起被拉開。
- 建議
- 先用預設的 0.5/99.5。亮點很多就把亮端調成 99 左右;顏色變怪就改回「只看亮度」。
亮度/對比
- 原理
- 線性公式:新值=係數×(舊值−127.5)+127.5+2.55×亮度,係數=(100+對比)÷100。亮度是整體平移,對比是繞著中灰放大或縮小差距。
- 適合
- 小幅微調,或在其他步驟處理完大方向之後收尾。
- 代價
- 暗部與亮部一起被推動;超出 0 到 255 的值被夾住,細節就此消失(亮部爆白、暗部死黑),事後無法從結果還原。
- 建議
- 幅度小一點(正負 20 以內)。要大幅提亮暗圖,先考慮伽瑪或陰影提亮。
伽瑪
- 原理
- 新值=255×(舊值÷255)的(1÷伽瑪)次方。伽瑪大於 1 時主要提亮中間調,0 與 255 兩端不動,所以比單純加亮度不容易爆白。
- 適合
- 整體偏暗的照片或截圖。
- 代價
- 暗部原本的雜訊與壓縮痕跡也被提亮、變得明顯。
- 建議
- 1.2 到 2.0。提亮後若暗部出現色塊或顆粒,再加上去雜訊。
背景平整(光照不均)
- 原理
- 先把圖縮小,在縮小圖上求出每個位置的「紙張亮度」:輕微模糊,取局部最亮值(把較細的字跡濾掉),再平滑;然後把偏暗的位置乘上增益,拉到與最亮處一致(增益上限預設 2.5)。勾選「把紙張亮度拉到白色」時,目標直接是 255。
- 適合
- 掃描或翻拍的文件:有手的陰影、折痕邊的暗角、光源不均。
- 代價
- 只會提亮、不會壓暗;增益只看亮度,色相不動。大面積深色圖案(照片、粗黑框、印章)會被誤認成「背景變暗」而被提亮。
- 建議
- 範圍(占短邊的比例)要比最粗的字跡大;圖案很大時把範圍調大,或降低套用比例。
陰影/亮部恢復
- 原理
- 用大半徑模糊取得每個位置的「局部亮度」。局部越暗、像素本身也不亮的地方,增益越大(最多約 4 倍);亮部壓低則只看局部亮度,把局部過亮的區域整塊壓暗一些,保留區域內的細節。
- 適合
- 逆光、暗角、部分區域很暗而其他區域正常的照片。
- 代價
- 陰影裡的雜訊同樣被放大;用力過度會出現暈影與不自然的平坦感。
- 建議
- 陰影提亮 30 到 60;亮部壓低通常 0 到 20;範圍用預設的 8 %短邊。
CLAHE 區域對比
- 原理
- 把圖分成若干圖磚(預設長邊 8 塊),每塊各自做直方圖均衡,但限制單一亮度的放大幅度(限制值);相鄰圖磚之間做內插,避免出現格線。只作用在亮度,顏色資訊不動。「套用比例」可以只混入一部分。
- 適合
- 對比很低、但局部仍有細節的灰濛畫面,例如霧中、夜間監視器。
- 代價
- 雜訊會被一起放大,平坦區域可能長出原本不存在的紋理;在下方的合成樣本中,它在某些圖上讓分數下降。
- 建議
- 限制值 1.5 到 2.5;套用比例 30 到 60;先去雜訊再用。
灰階世界白平衡
- 原理
- 假設整張圖的平均色應該是灰色:算出紅、綠、藍三個通道的平均(只取亮度 8 到 247 的像素),把偏離總平均的通道乘上補償增益(限制在 0.5 到 2 倍)。
- 適合
- 室內燈光造成的整體偏黃或偏藍,且畫面內容的色彩夠多樣。
- 代價
- 單色場景(大片草地、藍牆、紅色背景)本來就偏某個顏色,會被誤判成色偏而調歪。
- 建議
- 看預覽決定;不確定時把套用比例降到 50 以下。
去除色偏
- 原理
- 轉到 YCbCr 色彩空間,算出中間調(亮度 20 到 235)的平均色度,把它移到中性;等價於對 R、G、B 各加一個固定的位移,亮度不變。
- 適合
- 紅外線夜視的綠色、單色路燈造成的整片色偏。
- 代價
- 場景本來就偏色(例如白天的綠色草地)時會被拉回灰;暗部雜訊的色彩可能被放大成紫綠色斑點。
- 建議
- 夜間畫面先去雜訊再去色偏;出現彩色斑點就降低強度。
去雜訊:中值
- 原理
- 每個像素換成周圍視窗(3×3、5×5 或 7×7)內的中位數。孤立的亮點或暗點(椒鹽雜訊)因為不是中位數而被丟掉。
- 適合
- 零星的白點、黑點。
- 代價
- 細線、小點、小字的筆畫可能變細或消失;半徑越大越明顯。
- 建議
- 半徑 1 就夠。文字截圖慎用。
去雜訊:雙邊濾波
- 原理
- 和模糊一樣取鄰居的加權平均,但顏色差很大的鄰居權重趨近於 0,所以邊緣不會被抹平,平坦區域的顆粒被平均掉。
- 適合
- 一般的顆粒、感光元件雜訊、輕度壓縮雜訊。
- 代價
- 顏色容忍度太大時像塗了一層蠟,細紋理(皮膚、布料、草)消失;對零星的椒鹽雜訊幾乎無效(見實測)。
- 建議
- 半徑 2;顏色容忍度 20 到 40。
去雜訊:非局部平均
- 原理
- 以每個像素為中心取一小塊,到附近(搜尋半徑內)找外觀相似的小塊,依相似度加權平均。這是為了能在瀏覽器內快速完成的簡化近似版,不是完整的 NLM 實作。
- 適合
- 想保留較多紋理的高斯型雜訊。
- 代價
- 比其他去雜訊慢;強度太大時細節被抹平。
- 建議
- 強度 8 到 15。大圖先在預覽上確認再套用到原尺寸。
反銳化遮罩
- 原理
- 用亮度減去它的模糊版本,得到「細節」;把細節乘上強度再加回亮度。差異小於門檻的位置不動(避免連雜訊一起加強)。顏色資訊不動。
- 適合
- 輕微失焦、或縮小放大後略軟的圖。
- 代價
- 邊緣出現一亮一暗兩道光暈;雜訊與 JPEG 方塊也被放大。過度銳化會讓字看起來「更清楚」,其實是把邊緣畫粗了。
- 建議
- 半徑 1 到 1.5;強度 50 到 100;門檻 2 左右可避免放大平坦處的雜訊。
輕度去模糊
- 原理
- Richardson–Lucy 反卷積:假設模糊像一個高斯形狀,反覆比較「若現在的估計是清楚的,模糊後會長怎樣、和觀測差多少」,再修正估計。「防振鈴」把結果夾在原圖鄰域亮度範圍附近,減少亮邊暗邊。
- 適合
- 輕度的鏡頭失焦,且雜訊不多。
- 代價
- 動態模糊(拖影)、嚴重失焦、JPEG 壓縮後的模糊都不符合假設,效果有限,甚至變差;迭代越多越容易出現振鈴與雜訊顆粒。
- 建議
- 模糊半徑估計 1.0 到 1.5;迭代 5 到 12;先去雜訊再去模糊。
放大
- 原理
- 新像素的值是附近舊像素的加權平均(Lanczos3 或雙三次)。這只是內插,沒有任何新資訊進來。
- 適合
- 字太小,放大後比較好閱讀;要列印或疊加標註。
- 代價
- 看起來比較平滑,不代表更清楚;放大再銳化會把錯覺做得更逼真。×4 只會得到更大、更軟的圖。
- 建議
- ×2 通常就夠;之後輕度銳化(強度 60 左右)。
傾斜微調
- 原理
- 以影像中心為軸旋轉一個小角度(正值為順時針,範圍正負 15 度)。「估計傾斜角」用投影輪廓法:把疑似墨跡的點投影到旋轉後的垂直軸,文字行對齊時投影最尖,據此找角度;結果附信心值,只是相對指標,不是機率。建議值由你看預覽決定是否採用。
- 適合
- 掃描或翻拍時歪了幾度的文件。
- 代價
- 旋轉必須內插,細線會略軟;空白角要填色,或自動裁掉(裁掉會改變取景,前後對照只提供並排)。沒有明顯文字行的圖,估計值沒有意義,工具會標示「不可靠」。
- 建議
- 先按「估計傾斜角」,再看預覽決定;插補用雙三次。
裁切
- 原理
- 以百分比指定要保留的範圍。
- 適合
- 去掉無關的邊緣,專注在要檢視的區域。
- 代價
- 改變取景;處理紀錄會寫入裁切範圍。需要保留完整脈絡時不要裁,或另存一份。
- 建議
- 放在流程最後。
反相
- 原理
- 新值=255−舊值。
- 適合
- 底片、白字黑底的反白。
- 代價
- 彩色底片反相後還有橘色的底(色罩)需要另外處理。反相本身可逆,沒有資訊損失。
- 建議
- 放在流程最前或最後。
PRESETS四組預設與使用建議
- 暗部提亮
- 自動色階→陰影/亮部恢復(陰影 40、亮部 10、範圍 8 %)→雙邊濾波(半徑 2、容忍度 25)→反銳化(半徑 1.2、強度 50、門檻 2)。適合整體偏暗的照片或截圖。若亮部已經爆白、或暗部只剩雜訊,沒有資訊可救,這組也變不出來。
- 夜間監視器畫面
- 中值(半徑 1)→雙邊濾波→去除色偏→自動色階→CLAHE(限制值 1.5、6 塊、套用 40 %)。先去雜訊再拉開對比,區域對比只套用一部分。限制:暗部雜訊可能被染成紫綠色斑;在下方的合成夜間樣本中,一張兩項分數都提高,另一張 PSNR 提高但 SSIM 略降。
- 文字截圖放大
- 放大 ×2(Lanczos3)→反銳化(半徑 1.0、強度 60)。放大不會長出原本沒有的細節;它讓字比較好讀,不讓字比較真。
- 掃描文件
- 傾斜微調(預設停用,要自己啟用)→背景平整(範圍 4 %、拉到白色)→自動色階(各通道)→雙邊濾波(容忍度 20)→反銳化(強度 70、門檻 2)。頁面歪斜時,用「估計傾斜角」取得建議值,看預覽後再決定。
- 怎麼調
- 預設只是起點,不是萬用解。請看前後對照與放大後的細節,再決定要不要換掉。
- 一次只改一個參數,並放大到 1:1 像素看邊緣、小字與暗部。出現光暈、塗蠟感、假紋理,就調回來。
- 步驟越少越好。每多一步,就多一份「這是處理出來的」的風險。
- 預覽在縮圖上計算,和原尺寸結果接近但不承諾逐像素相同;要檢查真正的像素,請套用到原尺寸後用 1:1 檢視。
PROCESSING LOG處理紀錄怎麼讀
每次「套用到原尺寸」都會同時產生處理紀錄:JSON(給程式讀,也可以在工具內匯入,還原步驟與參數)與 TXT(給人讀)。
- 紀錄裡有什麼
- input:原圖檔名、位元組數、類型、SHA-256、尺寸、檔案宣告的最後修改時間(檔案系統的宣告值,可被更改)、EXIF 方向標記(若有)。
- output:副本檔名、位元組數、格式、SHA-256、尺寸、JPEG 品質、
pixelsSha256(編碼前 RGBA 像素的雜湊)、是否加註;有加註時另有加註前的像素雜湊與加註內容。 - steps:每個啟用的步驟依序一筆:序號、代碼、名稱、全部參數、由影像算出的值(
derived,例如自動色階實際用到的暗端與亮端)、該步驟用時,以及一句該步驟的限制說明(note,例如放大不會增加資訊)。 - sizeChange、processing、stats:尺寸變化、總用時、處理前後的亮度平均、對比與清晰度指標。清晰度指標(拉普拉斯變異數)只是參考,雜訊與壓縮痕跡也會讓它變大。
- tool、createdAt、environment、notes:工具與版本、產生時間(本機時鐘)、瀏覽器識別字串,以及一組固定的提醒。
- 它能證明什麼、不能證明什麼
- 能說明:這份副本由哪一份原圖(以 SHA-256 指認)、經過哪些步驟與參數得到。
- 不能證明:原圖內容真實、紀錄沒有被改寫、處理的時間與紀錄所寫一致。紀錄是普通文字檔。要讓它有分量,請在產生後立刻用證據鏈帳本計算原圖、副本與紀錄的雜湊,並把封存碼交給第三方保存。
VERIFY YOURSELF如何自行驗證
- 先核對雜湊
- 用作業系統的 sha256sum(或 shasum -a 256、certutil -hashfile)對原圖與副本計算,和處理紀錄中的 input.sha256、output.sha256 比對。
- 或用下面的 Python 程式(只用標準函式庫,不依賴本站任何程式):
import hashlib, json
def sha256_of(path):
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(1 << 20), b""):
h.update(chunk)
return h.hexdigest()
ORIGINAL = "範例.png" # 你保存的原圖
COPY = "範例_增強版.png" # 下載的增強副本
LOG = "範例_增強版_處理紀錄.json" # 下載的處理紀錄(JSON)
log = json.load(open(LOG, encoding="utf-8"))
print("原圖與紀錄相符:", sha256_of(ORIGINAL) == log["input"]["sha256"])
print("副本與紀錄相符:", sha256_of(COPY) == log["output"]["sha256"])- 核對副本的像素
pixelsSha256 是編碼前 RGBA 像素的雜湊。輸出為 PNG 時,解碼後的像素與編碼前相同,可以這樣核對(需要 NumPy 與 Pillow):
import hashlib, json
import numpy as np
from PIL import Image
COPY = "範例_增強版.png" # 輸出為 PNG 時才能這樣核對
LOG = "範例_增強版_處理紀錄.json"
log = json.load(open(LOG, encoding="utf-8"))
rgba = np.asarray(Image.open(COPY).convert("RGBA")) # 高 × 寬 × 4
print("尺寸相符:", [rgba.shape[1], rgba.shape[0]] == [log["output"]["width"], log["output"]["height"]])
print("像素雜湊相符:", hashlib.sha256(rgba.tobytes()).hexdigest() == log["output"]["pixelsSha256"])輸出為 JPEG 時,解碼結果與編碼前的像素不同,這個核對不適用;JPEG 只能核對檔案雜湊。
- 用 NumPy 重現一個步驟
- 步驟的公式都寫在上面。以「自動色階(只看亮度)」為例:整數亮度=(299R+587G+114B+500)÷1000 取整;依累積分布找出暗端與亮端;再用查表把所有通道拉伸。若紀錄中只有這一個步驟,下面的程式最後一行應印出「相差: 0」:
import json
import numpy as np
from PIL import Image
ORIGINAL = "範例.png" # 不含透明度的 PNG
COPY = "範例_增強版.png"
LOG = "範例_增強版_處理紀錄.json" # 只啟用「自動色階」一個步驟、端點依據為「只看亮度」
log = json.load(open(LOG, encoding="utf-8"))
step = log["steps"][0]
assert step["id"] == "levels" and step["params"]["mode"] == "luma" and len(log["steps"]) == 1
p = step["params"]
src = np.asarray(Image.open(ORIGINAL).convert("RGB")).astype(np.int64)
out = np.asarray(Image.open(COPY).convert("RGB")).astype(np.int64)
luma = (299 * src[..., 0] + 587 * src[..., 1] + 114 * src[..., 2] + 500) // 1000 # 整數亮度
hist = np.bincount(luma.ravel(), minlength=256)
def percentile_index(h, n, q): # 最小的 v,使累積數 >= n*q/100
c = np.cumsum(h)
return int(np.argmax((c >= n * q / 100) & (c > 0)))
lo = percentile_index(hist, luma.size, p["low"])
hi = percentile_index(hist, luma.size, p["high"])
v = np.arange(256)
lut = np.floor(np.clip((v - lo) * 255 / (hi - lo), 0, 255) + 0.5).astype(np.int64) if hi > lo else v
print("暗端、亮端:", lo, hi, "| 紀錄中的值:", step.get("derived"))
print("與副本逐點比較,差最多的一點相差:", int(np.abs(lut[src] - out).max()))- 原圖要用 PNG 且不含透明度。JPEG 在不同解碼器之間可能有差 1 的像素,會使重現結果略有出入;這是解碼器的差異,不是處理步驟的差異。
- 步驟不只一個時,依序重現即可;要核對的是每一步的輸入,不是原圖。
- 我們如何驗證這些演算法
- 核心函式寫成可在 Node 執行的純函式,並有 574 項單元斷言(本機沙箱的測試,涵蓋正常、邊界、錯誤輸入與極端大小)。
- 另以 NumPy、SciPy、OpenCV、Pillow、scikit-image 做了 356 個交叉比對案例(版本:numpy 2.5.3、scipy 1.18.1、opencv 5.0.0、pillow 12.3.0、scikit-image 0.26.0)。結果如下,誤差越小越一致;這是對合成圖的比對,不代表所有真實圖片都相同。
交叉比對:本機沙箱小樣本。誤差單位為 0 到 255 的灰階(傾斜估計為度)。| 項目 | 對照對象 | 通過 | 「應一致」類的實測最差誤差 | 「解釋或近似」類的實測最差誤差 |
|---|
| 自動色階、亮度對比、伽瑪、反相、白平衡、去色偏 | NumPy 依定義、scikit-image rescale_intensity、OpenCV YCrCb | 94/94 | 1 | 0.1792 |
| 高斯模糊基礎(精確核與方塊近似) | SciPy gaussian_filter、OpenCV GaussianBlur | 46/46 | 4.6e-05 | 4.402 |
| 反銳化遮罩 | scikit-image unsharp_mask | 12/12 | 1 | — |
| 中值、雙邊、非局部平均 | OpenCV medianBlur、bilateralFilter、獨立實作 | 30/30 | 1 | — |
| CLAHE 區域對比 | OpenCV createCLAHE | 19/19 | 0 | — |
| Lanczos3、雙三次 | Pillow resize、獨立實作 | 42/42 | 1 | 16 |
| 傾斜微調 | Pillow rotate、OpenCV warpAffine、獨立實作 | 35/35 | 0 | 1 |
| 輕度去模糊 | NumPy/SciPy 獨立實作的 Richardson–Lucy | 6/6 | 1 | — |
| 陰影/亮部恢復 | NumPy/SciPy 依定義 | 14/14 | 0 | 2 |
| 背景平整 | NumPy/SciPy 依定義 | 8/8 | 1 | — |
| 預設流程「掃描文件」 | 各步驟的獨立參考依序串接 | 4/4 | 1 | — |
| 平均亮度、標準差、拉普拉斯變異數 | NumPy | 4/4 | 7.3e-12 | — |
| 投影輪廓法傾斜估計(單位:度) | 合成頁面的已知角度 | 42/42 | 0.1 | — |
合計 356 個案例,通過 356,未通過 0。「應一致」是指預期與對照對象相同(容許 ±1 的四捨五入差);「解釋或近似」是已知有差異、並以模型解釋或量化的案例(例如方塊模糊對真高斯、Pillow 的中介夾制)。
- 已知且已說明的差異:以獨立實作對照發現,Pillow 旋轉的雙三次係數相當於 −1,OpenCV 是 −0.75,本工具採用 −0.5(Catmull–Rom),所以和兩者的結果會略有不同;σ 大於 2 的模糊改用三次方塊模糊近似真高斯(形狀差異以「解釋或近似」類量化);CLAHE 的內插順序模仿 OpenCV 5.0 的單精度運算;Pillow 縮放時把橫向結果先存成 8 位元並夾在 0 到 255,所以在飽和的銳利邊會和本工具(全程浮點)差到 16 個灰階。
- 環境差異:不同瀏覽器的數學函式與影像編碼器可能有末位差異,所以跨瀏覽器重跑同一組步驟,
pixelsSha256 不一定相同,輸出檔的雜湊也不一定相同。
MEASURED, WITH LIMITS實測:什麼時候有幫助,什麼時候沒有
以下數字全部是「本機沙箱小樣本」:用標準測試圖與程式合成的頁面,人為製造劣化,再對照「已知的乾淨原圖」計算 PSNR(分貝,越高越接近)與 SSIM(0 到 1,越高越相似)。真實案件沒有乾淨原圖可以比,所以這些分數只能說明「在這個人造情境下發生了什麼」,不能直接推論到你的圖,更不是準確率。
共 74 組「情境×處理方式」,判讀為:改善 53、有升有降 17、幾乎不變 3、變差 1。判讀規則:PSNR 提高至少 0.5 分貝且 SSIM 提高至少 0.005 為「改善」;兩者都下降到同樣門檻為「變差」;兩者變動都小於門檻為「幾乎不變」;其餘為「有升有降」。
- 有幫助的:偏暗與曝光不足的圖,提亮後兩項分數都明顯提高;掃描件的背景平整;中值濾波對椒鹽雜訊(PSNR 約提高 14 分貝);輕度高斯模糊加上去模糊或反銳化(PSNR 約提高 0.8 到 2.8 分貝);傾斜估計在乾淨的合成頁面上誤差在 0.1 度以內。
- 沒有幫助、甚至更差的:低對比圖加上 CLAHE,分數有升有降,一個組合還變差;動態模糊套用「假設高斯」的去模糊,幾乎不變;雙邊濾波與非局部平均對椒鹽雜訊幾乎無效;夜間畫面的預設組合在其中一張圖上 PSNR 提高但 SSIM 略降;單純放大(Lanczos3、雙三次)相對最近鄰放大,分數只改善一點點(×2 時 PSNR 約 0.2 到 0.4 分貝),可見放大主要是改變觀感而不是增加資訊;放大後再輕度銳化,改善較多。
- 估計值要看信心:沒有文字的場景(人像、靜物各一張)估計值沒有意義:本次 2 張中有 2 張被標為「不可靠」(信心值約 0.04;工具以信心值大於 0.06 且墨跡點數足夠才標為可靠);較難的頁面(背景漸層、雜訊、重度壓縮)3 張,誤差都在 0.05 度以內,信心值約 0.53,全部標為可靠。這些都是程式合成的頁面;真實照片裡的文件常有陰影、摺痕、透視與背景花紋,估計可能偏離,請一律對照預覽目視確認。
展開全部合成劣化結果(74 列)
合成劣化實驗(亮度,對「已知的乾淨原圖」的 PSNR 分貝/SSIM):本機沙箱小樣本。| 劣化情境 | 處理方式 | 處理前 | 處理後 | 判讀 |
|---|
| 偏暗(像素值×0.2+雜訊)— astronaut | 預設「暗部提亮」 | 7.12/0.338 | 27.12/0.842 | 改善 |
| 只做自動色階 | | 28.50/0.743 | 改善 |
| 色階+伽瑪 1.6 | | 18.34/0.678 | 改善 |
| 色階+陰影提亮+中值去雜訊 | | 23.76/0.820 | 改善 |
| 曝光不足(線性光×0.2+雜訊)— astronaut | 預設「暗部提亮」 | 10.71/0.670 | 28.37/0.896 | 改善 |
| 只做自動色階 | | 30.31/0.885 | 改善 |
| 伽瑪 2.2(還原曝光的近似) | | 18.84/0.748 | 改善 |
| 伽瑪 2.2+雙邊去雜訊 | | 18.97/0.750 | 改善 |
| 偏暗(像素值×0.2+雜訊)— coffee | 預設「暗部提亮」 | 8.27/0.281 | 23.04/0.890 | 改善 |
| 只做自動色階 | | 27.87/0.778 | 改善 |
| 色階+伽瑪 1.6 | | 17.84/0.685 | 改善 |
| 色階+陰影提亮+中值去雜訊 | | 19.62/0.808 | 改善 |
| 曝光不足(線性光×0.2+雜訊)— coffee | 預設「暗部提亮」 | 11.78/0.638 | 22.86/0.935 | 改善 |
| 只做自動色階 | | 28.64/0.899 | 改善 |
| 伽瑪 2.2(還原曝光的近似) | | 19.42/0.795 | 改善 |
| 伽瑪 2.2+雙邊去雜訊 | | 19.53/0.792 | 改善 |
| 低對比(範圍壓到 95–184)— chelsea | 只做自動色階 | 17.49/0.781 | 16.41/0.833 | 有升有降 |
| 色階 0.1/99.9 百分位 | | 16.36/0.862 | 有升有降 |
| CLAHE(區域對比) | | 17.84/0.912 | 有升有降 |
| 色階+CLAHE 50% | | 16.49/0.701 | 變差 |
| 低對比(範圍壓到 95–184)— rocket | 只做自動色階 | 13.01/0.699 | 26.91/0.836 | 改善 |
| 色階 0.1/99.9 百分位 | | 31.48/0.887 | 改善 |
| CLAHE(區域對比) | | 12.66/0.671 | 有升有降 |
| 色階+CLAHE 50% | | 21.15/0.595 | 有升有降 |
| 高斯模糊 σ=1.5(無雜訊)— astronaut | 反銳化 1.5 px/強度 1.0 | 26.78/0.877 | 28.60/0.916 | 改善 |
| 去模糊 σ=1.5、10 次 | | 29.17/0.925 | 改善 |
| 去模糊 σ=1.5、20 次 | | 29.59/0.931 | 改善 |
| 高斯模糊 σ=1.5+雜訊 σ=2 — astronaut | 反銳化 1.5 px/強度 1.0 | 26.66/0.857 | 28.25/0.862 | 改善 |
| 去模糊 σ=1.5、10 次 | | 28.94/0.899 | 改善 |
| 先雙邊去雜訊再去模糊 | | 28.64/0.899 | 改善 |
| 先雙邊去雜訊再反銳化 | | 28.17/0.889 | 改善 |
| 動態模糊(9 px、20°)+雜訊 σ=2 — astronaut | 反銳化 1.5 px/強度 1.0 | 24.31/0.788 | 24.49/0.765 | 有升有降 |
| 去模糊(假設高斯 σ=2、10 次) | | 24.54/0.792 | 幾乎不變 |
| 高斯模糊 σ=1.5(無雜訊)— coffee | 反銳化 1.5 px/強度 1.0 | 28.17/0.825 | 29.50/0.864 | 改善 |
| 去模糊 σ=1.5、10 次 | | 29.77/0.871 | 改善 |
| 去模糊 σ=1.5、20 次 | | 30.05/0.879 | 改善 |
| 高斯模糊 σ=1.5+雜訊 σ=2 — coffee | 反銳化 1.5 px/強度 1.0 | 28.00/0.811 | 29.05/0.817 | 改善 |
| 去模糊 σ=1.5、10 次 | | 29.51/0.852 | 改善 |
| 先雙邊去雜訊再去模糊 | | 29.10/0.842 | 改善 |
| 先雙邊去雜訊再反銳化 | | 28.82/0.832 | 改善 |
| 動態模糊(9 px、20°)+雜訊 σ=2 — coffee | 反銳化 1.5 px/強度 1.0 | 26.73/0.794 | 26.77/0.777 | 有升有降 |
| 去模糊(假設高斯 σ=2、10 次) | | 26.60/0.790 | 幾乎不變 |
| 夜間畫面(偏綠+低對比+雜訊 σ=9+JPEG 55)— astronaut | 預設「夜間監視器畫面」 | 11.67/0.653 | 19.51/0.733 | 改善 |
| 中值+去色偏+色階(不做區域對比) | | 19.60/0.730 | 改善 |
| 舊組合:色階後 CLAHE 70%+反銳化 | | 18.18/0.593 | 有升有降 |
| 非局部平均+去色偏+色階 | | 19.71/0.756 | 改善 |
| 夜間畫面(偏綠+低對比+雜訊 σ=9+JPEG 55)— rocket | 預設「夜間監視器畫面」 | 18.34/0.759 | 23.39/0.746 | 有升有降 |
| 中值+去色偏+色階(不做區域對比) | | 24.84/0.724 | 有升有降 |
| 舊組合:色階後 CLAHE 70%+反銳化 | | 18.92/0.372 | 有升有降 |
| 非局部平均+去色偏+色階 | | 25.02/0.818 | 改善 |
| 高斯雜訊 σ=15 — astronaut | 中值 r=1 | 25.14/0.619 | 28.92/0.826 | 改善 |
| 中值 r=2 | | 27.24/0.837 | 改善 |
| 雙邊 r=3 σ=30 | | 31.70/0.839 | 改善 |
| 雙邊 r=3 σ=50 | | 30.43/0.824 | 改善 |
| 非局部平均 h=15 | | 32.43/0.848 | 改善 |
| 非局部平均 h=25 | | 31.27/0.823 | 改善 |
| 椒鹽雜訊 6% — astronaut | 中值 r=1 | 16.75/0.339 | 31.19/0.949 | 改善 |
| 雙邊 r=3 σ=30 | | 16.86/0.330 | 有升有降 |
| 非局部平均 h=15 | | 16.83/0.340 | 幾乎不變 |
| 掃描件(泛黃+左下偏暗+模糊 0.8+雜訊 σ=4+JPEG 60) | 預設「掃描文件」 | 11.87/0.915 | 21.23/0.972 | 改善 |
| 只做自動色階(各通道) | | 12.26/0.893 | 有升有降 |
| 只做背景平整(拉到白色) | | 17.57/0.953 | 改善 |
| 舊思路:色階(各通道)+陰影提亮 60 | | 12.70/0.900 | 有升有降 |
| 預設但不去雜訊 | | 21.22/0.943 | 改善 |
| 掃描件(泛黃+斜向漸層+模糊 0.8+雜訊 σ=4+JPEG 60) | 預設「掃描文件」 | 9.75/0.871 | 21.44/0.969 | 改善 |
| 只做自動色階(各通道) | | 10.70/0.864 | 有升有降 |
| 只做背景平整(拉到白色) | | 17.70/0.948 | 改善 |
| 舊思路:色階(各通道)+陰影提亮 60 | | 11.35/0.880 | 改善 |
| 預設但不去雜訊 | | 21.40/0.933 | 改善 |
| 掃描件(泛黃+手的陰影帶+模糊 0.8+雜訊 σ=4+JPEG 60) | 預設「掃描文件」 | 12.59/0.911 | 16.18/0.953 | 改善 |
| 只做自動色階(各通道) | | 13.10/0.893 | 有升有降 |
| 只做背景平整(拉到白色) | | 15.52/0.941 | 改善 |
| 舊思路:色階(各通道)+陰影提亮 60 | | 13.54/0.900 | 有升有降 |
| 預設但不去雜訊 | | 16.18/0.927 | 改善 |
展開放大實驗
放大實驗:把「真實」的 3 倍或 2 倍解析度頁面縮小後再放大回去,比較放大結果與真實頁面。處理前=最近鄰放大。| 情境 | 處理方式 | 處理前(最近鄰) | 處理後 | 判讀 |
|---|
| 文字截圖 ×2 | Lanczos3 | 21.99/0.944 | 22.37/0.946 | 幾乎不變 |
| 雙三次 | | 22.23/0.944 | 幾乎不變 |
| Lanczos3+反銳化 60% | | 22.94/0.957 | 改善 |
| Lanczos3+反銳化 120%(1.5 px) | | 21.99/0.960 | 有升有降 |
| 文字截圖 ×3 | Lanczos3 | 19.12/0.909 | 19.67/0.915 | 改善 |
| 雙三次 | | 19.57/0.913 | 幾乎不變 |
| Lanczos3+反銳化 60% | | 19.95/0.922 | 改善 |
| Lanczos3+反銳化 120%(1.5 px) | | 20.09/0.930 | 改善 |
展開傾斜估計實驗
傾斜估計(合成的白底黑字頁面):真值為需要套用的順時針角度(度)。| 真值 | 估計 | 誤差 | 信心值 | 標為可靠 | 轉正前 PSNR/SSIM | 用估計角轉正後 |
|---|
| -12.0 | -12.05 | 0.05 | 0.58 | 是 | 11.40/0.606 | 27.11/0.981 |
| -7.0 | -6.95 | 0.05 | 0.54 | 是 | 11.46/0.613 | 27.26/0.982 |
| -3.0 | -3.00 | 0.00 | 0.53 | 是 | 11.85/0.648 | 29.33/0.986 |
| -1.0 | -1.05 | 0.05 | 0.53 | 是 | 13.08/0.725 | 27.08/0.981 |
| +1.5 | +1.50 | 0.00 | 0.53 | 是 | 12.59/0.697 | 29.40/0.987 |
| +3.0 | +3.00 | 0.00 | 0.53 | 是 | 11.86/0.648 | 29.30/0.986 |
| +7.0 | +7.00 | 0.00 | 0.53 | 是 | 11.46/0.613 | 29.42/0.986 |
| +12.0 | +11.95 | 0.05 | 0.55 | 是 | 11.39/0.604 | 27.32/0.982 |
較難的頁面(背景漸層、雜訊、重度 JPEG 壓縮;3 張):誤差都在 0.05 度以內,信心值約 0.53,全部標為可靠。| 真值 | 估計 | 誤差 | 信心值 | 標為可靠 |
|---|
| -5.0 | -5.05 | 0.05 | 0.53 | 是 |
| +2.5 | +2.55 | 0.05 | 0.53 | 是 |
| +9.0 | +8.95 | 0.05 | 0.53 | 是 |
去雜訊對照
同一張加了高斯雜訊(σ=15)的圖,處理前 PSNR 25.14、SSIM 0.619。下表列出本工具的幾種去雜訊,以及外部函式庫的結果作為參考。外部函式庫的演算法與參數不同,不能直接拿來比高低;本工具的非局部平均是為了在瀏覽器內快速完成的簡化近似。
去雜訊對照(亮度,對乾淨原圖;本機沙箱小樣本)| 來源 | 處理方式 | PSNR(分貝)/SSIM |
|---|
| 本工具 | 中值 r=1 | 28.92/0.826 |
| 本工具 | 中值 r=2 | 27.24/0.837 |
| 本工具 | 雙邊 r=3 σ=30 | 31.70/0.839 |
| 本工具 | 雙邊 r=3 σ=50 | 30.43/0.824 |
| 本工具 | 非局部平均 h=15 | 32.43/0.848 |
| 本工具 | 非局部平均 h=25 | 31.27/0.823 |
| 外部函式庫 | OpenCV fastNlMeansDenoisingColored(h=12、模板 7、搜尋 21) | 28.95/0.796 |
| 外部函式庫 | OpenCV fastNlMeansDenoisingColored(h=18) | 27.79/0.794 |
| 外部函式庫 | OpenCV bilateralFilter(d=7、sigmaColor=60、sigmaSpace=3) | 31.93/0.840 |
| 外部函式庫 | OpenCV medianBlur(3×3) | 28.92/0.826 |
| 外部函式庫 | scikit-image denoise_nl_means(fast、patch 5、距離 6) | 28.01/0.760 |
PERFORMANCE效能與記憶體
以下數字全部來自本機沙箱的實測,只有一台機器、每個情境各測一次,不是你的裝置的預測。沙箱是 2 核心、回報裝置記憶體 8 GB 的無頭 Chromium 141.0.7390.37;真實手機沒有實測。
4000×3000 JPEG(約 12 百萬像素),三種預設流程,各測一次(本機沙箱小樣本;手機外觀只是瀏覽器的觸控與視窗模擬,不是真實手機)| 情境 | 預設流程 | 預覽(縮圖)秒 | 套用到原尺寸 秒 | 主執行緒最長任務 毫秒 | 最長畫面間隔 毫秒 |
|---|
| 正常速度 | 暗部提亮 | 0.7 | 5.2 | 無 | 33 |
|---|
| 正常速度 | 夜間監視器畫面 | 0.7 | 7.4 | 無 | 50 |
|---|
| 正常速度 | 掃描文件 | 0.5 | 5.5 | 無 | 17 |
|---|
| CDP 降速 4 倍(僅主執行緒) | 暗部提亮 | 1.2 | 6.0 | 70 | 67 |
|---|
| CDP 降速 4 倍(僅主執行緒) | 夜間監視器畫面 | 1.0 | 7.6 | 無 | 33 |
|---|
| CDP 降速 4 倍(僅主執行緒) | 掃描文件 | 0.8 | 5.0 | 70 | 67 |
|---|
| 手機外觀 390×844+CDP 降速 4 倍 | 暗部提亮 | 0.9 | 4.6 | 無 | 33 |
|---|
| 手機外觀 390×844+CDP 降速 4 倍 | 夜間監視器畫面 | 0.7 | 6.7 | 無 | 33 |
|---|
| 手機外觀 390×844+CDP 降速 4 倍 | 掃描文件 | 0.9 | 5.1 | 107 | 100 |
|---|
| 整個瀏覽器限制在 25 %單核 | 暗部提亮 | 4.1 | 21.7 | 92 | 200 |
|---|
| 整個瀏覽器限制在 25 %單核 | 夜間監視器畫面 | 3.5 | 30.9 | 92 | 100 |
|---|
| 整個瀏覽器限制在 25 %單核 | 掃描文件 | 2.7 | 21.7 | 89 | 183 |
|---|
載入並計算 SHA-256(4000×3000、約 1.3 MiB 的 JPEG):正常速度 0.5 秒、CDP 降速 4 倍(僅主執行緒) 0.7 秒、手機外觀 390×844+CDP 降速 4 倍 0.7 秒、整個瀏覽器限制在 25 %單核 2.8 秒。「主執行緒最長任務」只記錄超過 50 毫秒的任務,「無」表示沒有任何任務超過 50 毫秒。「最長畫面間隔」是在處理期間以 requestAnimationFrame 量到的相鄰畫面最長間隔,用來看畫面有沒有卡住。處理時畫面保持可操作,是因為計算全部在背景工作者內,主執行緒只負責畫面。
降速實測要怎麼讀
- CDP 的 CPU 降速(
Emulation.setCPUThrottlingRate)只作用於分頁的主執行緒。同一段迴圈在降速 4 倍時,主執行緒從 42 毫秒變成 141 毫秒,同一份程式在專用 Worker 內卻是 48 毫秒對 33 毫秒,幾乎沒變。所以「降速 4 倍」的那幾列只能說明主執行緒在變慢時畫面仍可操作(最長的任務與畫面間隔見表),不能拿來推算 Worker 內的處理時間。 - 要讓 Worker 也變慢,這裡把整個瀏覽器放進 Linux cgroup,限制在單一核心的 25 %。同一個迴圈主執行緒 201 毫秒、Worker 113 毫秒(正常速度時是 42 與 48)。這一列的處理時間約為正常速度的 4 到 5 倍,是「整體慢 4 到 5 倍的裝置」的粗略模擬,不是任何真實裝置的量測。
- 四種情境的載入、預覽與原尺寸處理加起來,主執行緒回報的長任務(超過 50 毫秒)最長為 107 毫秒。其中超過 100 毫秒的有 2 個:手機外觀 390×844+CDP 降速 4 倍(掃描文件的預覽)107、105 毫秒。這幾個都出現在主執行緒被降速 4 倍的情境。
各步驟在背景工作者內的用時(正常速度、4000×3000、單次實測)| 預設流程 | 處理合計 秒 | 各步驟 |
|---|
| 暗部提亮 | 5.2 | 自動色階 0.2 秒、陰影/亮部恢復 0.5 秒、去雜訊:雙邊濾波 2.2 秒、反銳化遮罩 0.7 秒 |
|---|
| 夜間監視器畫面 | 7.3 | 去雜訊:中值 2.1 秒、去雜訊:雙邊濾波 2.4 秒、去除色偏 0.2 秒、自動色階 0.1 秒、CLAHE 區域對比 0.7 秒 |
|---|
| 掃描文件 | 5.5 | 背景平整 0.4 秒、自動色階 0.2 秒、去雜訊:雙邊濾波 2.2 秒、反銳化遮罩 0.8 秒 |
|---|
記憶體
瀏覽器行程(含瀏覽器本體、GPU 與頁面,合計)的常駐記憶體,在上面幾次 4000×3000 的原尺寸處理後約為 969 到 1039 MB(粗略值,每次測量都包含瀏覽器本體;不是只算本工具)。套用到原尺寸之前,程式會先用保守公式估算尖峰記憶體,超過保護上限就不執行並說明原因:
套用到原尺寸前的尖峰記憶體估計(程式內建的保守估算,不是實測;保護上限 1536 MiB)| 預設流程 | 1920×1080 | 4000×3000 | 6000×4000 | 8000×5000 |
|---|
| 暗部提亮 | 約 40 MiB | 約 229 MiB | 約 458 MiB | 約 763 MiB |
|---|
| 夜間監視器畫面 | 約 32 MiB | 約 183 MiB | 約 366 MiB | 約 610 MiB |
|---|
| 掃描文件 | 約 40 MiB | 約 229 MiB | 約 458 MiB | 約 763 MiB |
|---|
| 文字截圖放大 | 約 134 MiB | 約 778 MiB | 約 1556 MiB,超過保護上限 | 輸出超過 100 百萬像素上限 |
|---|
保護上限預設 1536 MiB;瀏覽器回報裝置記憶體時,取「裝置記憶體 ×0.3」(最低 0.5 GiB)與預設值中較小者;沒有回報但主要輸入方式是觸控時降為 0.9 GiB。這個公式是按每一步的輸入、輸出與工作平面保守加總的設計值,沒有和實際的記憶體用量逐項對照;在較舊的裝置上仍可能失敗,失敗時會顯示「記憶體不足」的說明,而不是當機。
COMMON MISTAKES常見誤解
- 「增強之後看到車牌或人臉了。」
- 如果原圖有拍到,增強可能讓它比較好認;如果原圖沒有,銳化、放大與區域對比會製造看起來像字、像臉的紋理。請對照原圖,不要把副本裡新出現的筆畫當成原圖內容。
- 「放大 4 倍會更清楚。」
- 放大只是內插。×4 只會得到更大、更軟的圖;字是否可讀取決於原圖的像素。
- 「分數變高就是更接近真相。」
- PSNR、SSIM 都要有乾淨原圖才算得出來,真實案件沒有。工具內的「清晰度指標」只是拉普拉斯變異數,雜訊與壓縮痕跡也會讓它變大,僅供參考。
- 「預覽就是最後的結果。」
- 預覽在縮圖上計算,接近但不承諾逐像素相同;下載的是在原尺寸上重新處理的結果。
- 「有處理紀錄就沒人能質疑。」
- 紀錄只是文字檔,可以被編輯,時間來自本機時鐘。它記錄做法,讓別人能重做並比對;它不替內容背書。
- 「JPEG 比較小,輸出 JPEG 就好。」
- JPEG 有損,輸出時會再壓縮一次,可能把你剛處理好的細節抹掉或製造方塊。要保存工作副本,建議輸出 PNG。
- 「去模糊可以救回拖影或失焦的照片。」
- 本工具的去模糊假設模糊近似高斯,只適合輕度失焦。動態模糊、嚴重失焦與重度壓縮的圖,效果有限,也可能出現振鈴。
- 「換一個瀏覽器,結果也要逐位元相同。」
- 不承諾。數學函式與影像編碼器的差異可能造成末位不同;因此像素雜湊適合在同一個瀏覽器引擎下核對,檔案雜湊適合核對「這個檔案」。
- 「預設組合適合所有圖。」
- 不是。預設是針對常見情況的起點,實測中也有在個別圖上讓某項分數下降的例子。
建議的使用流程
- 先把原圖另存一份並設為唯讀,不要在原檔上做任何事。
- 在工具內載入圖片,確認檔案資訊(尺寸、SHA-256)無誤。
- 選最接近的預設;看前後對照,放大檢查邊緣、小字與暗部。
- 需要時一次只調一個參數;出現光暈、塗蠟感或假紋理就調回來。
- 套用到原尺寸,輸出 PNG;同時下載增強副本與處理紀錄(JSON 與 TXT)。
- 用證據鏈帳本為原圖、副本與紀錄計算雜湊並匯出,封存碼交給第三方保存。
- 交付時三者一起附上,並明確說明「這份是增強副本,經過哪些處理」。
- 是否可作為證據、怎麼提出,請諮詢律師。