頻局部化降噪原理與工程實(shí)現(xiàn))
簡介本資源是一套面向信號處理與圖像分析初學(xué)者及進(jìn)階學(xué)習(xí)者的Morlet小波實(shí)驗(yàn)實(shí)踐包聚焦二維Morlet小波在圖像多尺度分解與信號去噪中的核心應(yīng)用。內(nèi)容涵蓋理論原理、MATLAB代碼實(shí)現(xiàn)、可視化結(jié)果與實(shí)測數(shù)據(jù)適用于數(shù)字圖像處理、遙感/醫(yī)學(xué)影像預(yù)處理、課程設(shè)計(jì)及科研入門場景。壓縮包共9個(gè)文件2.81MB含4個(gè)MATLAB源碼如b.m、imageScaleT.m等實(shí)現(xiàn)三級小波分解與去噪流程、2張?jiān)?處理后JPG圖像、1張PNG效果圖、1個(gè)MAT文件7.31.mat存儲(chǔ)實(shí)驗(yàn)數(shù)據(jù)及1個(gè)FIG圖形文件完整呈現(xiàn)從一維信號到二維圖像的Morlet小波變換全流程。已有557人學(xué)習(xí)下載用戶可直接運(yùn)行代碼復(fù)現(xiàn)實(shí)驗(yàn)獲取帶注釋的去噪腳本、多尺度系數(shù)可視化方法、閾值選取參考及Morlet圖像生成邏輯快速掌握小波去噪的關(guān)鍵參數(shù)調(diào)優(yōu)與結(jié)果評估技巧。1. Morlet小波為什么是二維圖像去噪的“隱形主力”它不靠卷積核大小贏而靠時(shí)頻局部化贏你有沒有試過用高斯濾波或中值濾波處理一張帶紋理的醫(yī)學(xué)CT切片結(jié)果邊緣糊成一片、細(xì)小血管直接消失或者在遙感圖像里想壓制條帶噪聲又怕把農(nóng)田邊界也抹平這時(shí)候翻開源碼看別人怎么做的十有八九會(huì)撞見morlet——不是作為某個(gè)深度學(xué)習(xí)模塊的裝飾而是真正在底層扛起時(shí)頻分析大旗的實(shí)戰(zhàn)組合。Morlet小波不是“更高級的濾波器”它是把圖像當(dāng)成二維非平穩(wěn)信號來解構(gòu)既關(guān)心某塊區(qū)域“能量強(qiáng)不強(qiáng)”幅值也死磕“這股能量集中在哪個(gè)尺度、哪個(gè)方向”頻率相位。標(biāo)題里反復(fù)出現(xiàn)的“二維_Morlet圖像_信號去噪”說的就是這件事用復(fù)數(shù)Morlet小波在圖像平面做連續(xù)小波變換CWT把噪聲和結(jié)構(gòu)分別釘在不同尺度-方向通道里再做閾值裁剪——這不是圖像處理是信號處理思維在像素陣列上的落地。適合誰不是只調(diào)cv2.bilateralFilter參數(shù)的初學(xué)者而是手上有低劑量CT、紅外熱成像、顯微電鏡圖、SAR遙感圖等信噪比吃緊、結(jié)構(gòu)細(xì)節(jié)敏感的一線算法工程師也適合正被“傳統(tǒng)濾波保邊難、深度學(xué)習(xí)缺標(biāo)注、小波包分解維度爆炸”三重卡脖子的團(tuán)隊(duì)。它不承諾端到端PSNR暴漲5dB但能給你可解釋、可調(diào)控、不依賴大數(shù)據(jù)集的確定性降噪路徑。2. 從一維Morlet到二維Morlet為什么不能直接把1D公式套進(jìn)圖像2.1 一維Morlet小波的“血統(tǒng)”與局限復(fù)指數(shù)高斯窗的物理直覺Morlet小波本質(zhì)是一個(gè)復(fù)指數(shù)載波被高斯窗調(diào)制的結(jié)果。標(biāo)準(zhǔn)一維形式為$$ \psi(t) \pi^{-1/4} e^{i \omega_0 t} e^{-t^2 / 2} $$其中 $\omega_0$ 是中心角頻率通常取5~6以保證時(shí)頻分辨率平衡$\pi^{-1/4}$ 是歸一化系數(shù)。關(guān)鍵點(diǎn)在于它是個(gè)復(fù)函數(shù)輸出包含實(shí)部cosine-like和虛部sine-like合起來能同時(shí)捕獲信號的幅度和相位信息。這對一維信號去噪極有用——比如心電圖R波檢測相位突變比幅值變化更魯棒。但直接把它當(dāng)卷積核在圖像上滑動(dòng)會(huì)出大問題。原因有三各向同性陷阱1D Morlet沿時(shí)間軸延展但圖像有x/y兩個(gè)空間維度。若簡單用 $ \psi(x) \cdot \psi(y) $ 做可分離乘積得到的是圓對稱小波無法區(qū)分水平邊緣、垂直紋理、45°裂縫——而真實(shí)圖像結(jié)構(gòu)高度方向敏感尺度耦合失效1D中縮放參數(shù) $a$ 控制單一尺度但在2D中僅縮放x/y相同倍數(shù)各向同性縮放會(huì)丟失“長條狀噪聲”如CT掃描線的定向抑制能力相位信息冗余圖像灰度是實(shí)值場1D Morlet的復(fù)輸出在2D中會(huì)產(chǎn)生四組冗余分量實(shí)/虛 × x/y徒增計(jì)算且無物理意義。提示別被“二維小波”字面迷惑——真正有效的2D Morlet不是1D的簡單外積而是構(gòu)造方向選擇性的復(fù)數(shù)基函數(shù)。這是所有后續(xù)操作的起點(diǎn)。2.2 二維Morlet小波的工程化定義方向尺度偏移三要素工業(yè)界和論文中廣泛采用的2D Morlet定義如Torrence Compo, 1998是$$ \psi_{a,\theta}(x,y) \frac{1}{a^2} \pi^{-1/2} e^{i \omega_0 \left( \frac{x \cos\theta y \sin\theta}{a} \right)} e^{-\left[ \left( \frac{x \cos\theta y \sin\theta}{a} \right)^2 \left( \frac{-x \sin\theta y \cos\theta}{a} \right)^2 \right] / 2} $$這個(gè)式子看著嚇人拆解后就是三個(gè)可控旋鈕尺度參數(shù) $a$控制小波在主方向$\theta$上的伸展長度。$a$ 越大感受野越寬對應(yīng)低頻粗結(jié)構(gòu)$a$ 越小聚焦越細(xì)對應(yīng)高頻噪聲/邊緣。實(shí)踐中 $a$ 取 2^k 形式k0,1,2,...形成對數(shù)尺度序列方向參數(shù) $\theta$決定小波的“朝向”。$\theta0^\circ$ 捕捉水平結(jié)構(gòu)$\theta90^\circ$ 捕捉垂直結(jié)構(gòu)$\theta45^\circ$ 捕捉斜向紋理。典型設(shè)置為 $\theta \in {0^\circ, 45^\circ, 90^\circ, 135^\circ}$共4個(gè)方向旋轉(zhuǎn)坐標(biāo)系式中 $x \cos\theta y \sin\theta$ 是沿 $\theta$ 方向的投影主軸$-x \sin\theta y \cos\theta$ 是垂直方向副軸。高斯窗在主軸方向按 $a$ 縮放在副軸方向也按 $a$ 縮放——這是各向同性縮放若要各向異性如拉長副軸以增強(qiáng)線狀特征需額外引入副軸縮放因子 $b$$b \neq a$但會(huì)顯著增加參數(shù)調(diào)優(yōu)成本Morlet圖像去噪中95%場景用各向同性已足夠。2.3 在Python中手搓二維Morlet小波核避開SciPy的坑很多工程師第一反應(yīng)是查scipy.signal.morlet2但注意morlet2返回的是1D Morlet在指定尺度下的采樣不是2D核它設(shè)計(jì)初衷是給1D信號做CWT強(qiáng)行reshape成2D會(huì)得到錯(cuò)誤的方向響應(yīng)。正確做法是自己生成2D網(wǎng)格并代入公式import numpy as np import matplotlib.pyplot as plt def morlet2d(shape, scale, theta, omega05.0): 生成二維Morlet小波核 :param shape: (height, width) 輸出核尺寸建議為奇數(shù)如33x33 :param scale: 尺度參數(shù) a 0 :param theta: 方向角弧度 :param omega0: 中心頻率默認(rèn)5.0保證時(shí)頻局部化 :return: 復(fù)數(shù)二維數(shù)組 (H, W) h, w shape # 創(chuàng)建中心對齊的坐標(biāo)網(wǎng)格-h//2 到 h//2-1 y np.arange(-h//2, h//2).reshape(-1, 1) # (h, 1) x np.arange(-w//2, w//2).reshape(1, -1) # (1, w) # 旋轉(zhuǎn)坐標(biāo)系u x*cosθ y*sinθ, v -x*sinθ y*cosθ u x * np.cos(theta) y * np.sin(theta) v -x * np.sin(theta) y * np.cos(theta) # Morlet公式π^(-1/2) * exp(i*ω0*u/a) * exp(-(u2v2)/(2a2)) # 注意這里省略了1/a2歸一化因后續(xù)做卷積時(shí)會(huì)由conv2d自動(dòng)處理 psi (np.pi**(-0.5) * np.exp(1j * omega0 * u / scale) * np.exp(-(u**2 v**2) / (2 * scale**2))) return psi # 示例生成一個(gè)33x33、尺度a4、方向0°的Morlet核 kernel_0deg morlet2d((33, 33), scale4, theta0) print(fKernel shape: {kernel_0deg.shape}, dtype: {kernel_0deg.dtype}) # 輸出Kernel shape: (33, 33), dtype: complex128這段代碼的關(guān)鍵邏輯說明y和x使用arange(-h//2, h//2)確保核中心在(0,0)這對保持卷積的空間對齊至關(guān)重要u/v的旋轉(zhuǎn)計(jì)算必須嚴(yán)格按公式任何符號錯(cuò)誤如v的負(fù)號漏掉會(huì)導(dǎo)致方向響應(yīng)完全錯(cuò)亂omega05.0是經(jīng)驗(yàn)值小于4則高斯窗太寬時(shí)域定位差大于7則復(fù)指數(shù)振蕩過密頻域泄漏嚴(yán)重返回complex128類型因?yàn)楹罄m(xù)CWT需要保留相位信息用于重構(gòu)。注意此核是復(fù)數(shù)不能直接用cv2.filter2D它只支持實(shí)數(shù)核。必須用scipy.signal.convolve2d或 PyTorch 的F.conv2d輸入轉(zhuǎn)為復(fù)數(shù)張量。3. 二維Morlet連續(xù)小波變換CWT實(shí)戰(zhàn)如何把一張圖變成多尺度-多方向特征圖3.1 CWT流程圖不是一次卷積而是“尺度×方向”的全排列掃描對一張灰度圖像 $I(x,y)$ 做2D Morlet CWT本質(zhì)是對每個(gè)預(yù)設(shè)尺度 $a_k$ 和每個(gè)預(yù)設(shè)方向 $\theta_m$用對應(yīng)的2D Morlet核 $\psi_{a_k,\theta_m}(x,y)$ 與圖像做卷積得到該尺度-方向下的復(fù)數(shù)響應(yīng) $W_{a_k,\theta_m}(x,y)$。整個(gè)過程可理解為構(gòu)建一個(gè)4D張量(尺度數(shù), 方向數(shù), 高度, 寬度)。例如取4個(gè)尺度a2,4,8,16和4個(gè)方向0°,45°,90°,135°最終得到16張復(fù)數(shù)特征圖。每張圖的模長|W|表示該位置在該尺度-方向下的能量強(qiáng)度相位angle(W)表示結(jié)構(gòu)走向。去噪的核心就藏在這里噪聲在所有尺度-方向上呈現(xiàn)均勻、無結(jié)構(gòu)的“毛刺”能量而真實(shí)結(jié)構(gòu)只在特定尺度-方向上形成連貫的高能量脊線。3.2 用Scipy實(shí)現(xiàn)高效CWT避免for循環(huán)的向量化技巧直接寫四層嵌套for循環(huán)尺度×方向×圖像高×圖像寬會(huì)慢到無法忍受。正確姿勢是預(yù)生成所有核堆疊成4D張量再用scipy.signal.convolve2d批量卷積。但注意convolve2d不支持批量核所以得用scipy.ndimage.convolve配合np.stackfrom scipy import ndimage import numpy as np def cwt_2d_morlet(image, scales, thetas, omega05.0, kernel_size33): 對圖像執(zhí)行2D Morlet連續(xù)小波變換 :param image: 2D numpy array (H, W)灰度圖 :param scales: 尺度列表如 [2,4,8,16] :param thetas: 方向列表弧度如 [0, np.pi/4, np.pi/2, 3*np.pi/4] :return: 4D complex array (len(scales), len(thetas), H, W) h, w image.shape # 預(yù)生成所有核并堆疊(S, T, K, K) kernels [] for a in scales: for theta in thetas: kernel morlet2d((kernel_size, kernel_size), scalea, thetatheta, omega0omega0) kernels.append(kernel) kernels np.stack(kernels) # (S*T, K, K) # 將圖像擴(kuò)展為 (1, H, W) 以便廣播 image_3d image[np.newaxis, ...] # (1, H, W) # 批量卷積對每個(gè)核與圖像做2D卷積 # 注意ndimage.convolve默認(rèn)用constant填充邊界效應(yīng)需后續(xù)處理 cwt_result np.zeros((len(scales), len(thetas), h, w), dtypenp.complex128) idx 0 for i, a in enumerate(scales): for j, theta in enumerate(thetas): # 卷積輸出與輸入同尺寸modesame conv_real ndimage.convolve(image, np.real(kernels[idx]), modeconstant, cval0.0) conv_imag ndimage.convolve(image, np.imag(kernels[idx]), modeconstant, cval0.0) cwt_result[i, j] conv_real 1j * conv_imag idx 1 return cwt_result # 示例調(diào)用 img np.random.rand(256, 256) # 模擬含噪圖像 scales [2, 4, 8, 16] thetas [0, np.pi/4, np.pi/2, 3*np.pi/4] cwt_out cwt_2d_morlet(img, scales, thetas) print(fCWT output shape: {cwt_out.shape}) # (4, 4, 256, 256)這段代碼的性能關(guān)鍵點(diǎn)kernel_size33是經(jīng)驗(yàn)值太大如65導(dǎo)致核內(nèi)大部分值趨近于0純屬算力浪費(fèi)太小如15則無法覆蓋Morlet的有效支撐域約±3σ造成截?cái)嗾`差modeconstant, cval0.0是最穩(wěn)妥的邊界填充避免reflect或wrap引入虛假周期性分開計(jì)算實(shí)部/虛部卷積是因?yàn)閚dimage.convolve不支持復(fù)數(shù)核——這是Scipy的硬限制繞不開輸出cwt_out[i,j]是復(fù)數(shù)矩陣后續(xù)所有操作閾值、重構(gòu)都基于其模長和相位。3.3 可視化CWT結(jié)果看懂“能量脊線”才是去噪的開始光有數(shù)據(jù)不夠得會(huì)讀圖。以下代碼將CWT結(jié)果中某尺度-方向的模長圖可視化并疊加原始圖像對比def plot_cwt_slice(cwt_result, scale_idx, theta_idx, original_img, title_suffix): 繪制單個(gè)尺度-方向的CWT模長圖 magnitude np.abs(cwt_result[scale_idx, theta_idx]) fig, axes plt.subplots(1, 2, figsize(12, 5)) # 左圖原始圖像 axes[0].imshow(original_img, cmapgray) axes[0].set_title(fOriginal Image {title_suffix}) axes[0].axis(off) # 右圖CWT模長歸一化到0-1 mag_norm (magnitude - magnitude.min()) / (magnitude.max() - magnitude.min() 1e-8) im axes[1].imshow(mag_norm, cmapjet) axes[1].set_title(fCWT Magnitude (scale{scales[scale_idx]}, θ{int(np.degrees(thetas[theta_idx]))}°)) axes[1].axis(off) plt.colorbar(im, axaxes[1], fraction0.046, pad0.04) plt.tight_layout() plt.show() # 繪制尺度2、方向0°的響應(yīng) plot_cwt_slice(cwt_out, scale_idx0, theta_idx0, original_imgimg, title_suffix(noisy))觀察重點(diǎn)在干凈區(qū)域如均勻背景模長圖呈現(xiàn)低幅值、無規(guī)律的“雪花噪點(diǎn)”在邊緣/紋理處模長圖出現(xiàn)連續(xù)、高亮的線條脊線其走向與邊緣方向一致在噪聲密集區(qū)如椒鹽噪聲點(diǎn)模長圖出現(xiàn)孤立、尖銳的亮點(diǎn)但無延伸性。這就是去噪的判據(jù)保留脊線抑制孤立點(diǎn)。下一章的閾值策略全基于這個(gè)視覺直覺。4. 小波系數(shù)閾值策略為什么全局閾值是玄學(xué)而尺度-方向自適應(yīng)才是正解4.1 全局閾值的三大翻車現(xiàn)場它為何在Morlet CWT中徹底失效很多教程直接套用Donoho的VisuShrink公式threshold σ * sqrt(2*log(N))N為像素總數(shù)σ為噪聲標(biāo)準(zhǔn)差。但在2D Morlet CWT中這招大概率翻車現(xiàn)象1邊緣斷裂。全局閾值一刀切把弱邊緣如CT中早期微鈣化灶的脊線能量誤判為噪聲削掉現(xiàn)象2偽影殘留。噪聲在某些尺度-方向上能量意外地高如傳感器固定模式噪聲全局閾值不夠狠殘留條帶現(xiàn)象3紋理失真。自然紋理如木材年輪、織物經(jīng)緯在多個(gè)尺度上都有響應(yīng)全局閾值無法區(qū)分“結(jié)構(gòu)”和“噪聲”的能量分布形態(tài)。根本原因Morlet CWT的系數(shù)統(tǒng)計(jì)特性隨尺度和方向劇烈變化。小尺度a2下系數(shù)近似高斯白噪聲大尺度a16下系數(shù)呈現(xiàn)長程相關(guān)性結(jié)構(gòu)主導(dǎo)。用同一閾值處理等于讓小學(xué)生和博士生考同一張數(shù)學(xué)卷。4.2 尺度-方向自適應(yīng)閾值用局部方差估計(jì)噪聲強(qiáng)度工業(yè)級做法是對每個(gè)尺度 $a_k$ 和每個(gè)方向 $\theta_m$獨(dú)立估計(jì)該通道的噪聲標(biāo)準(zhǔn)差 $\sigma_{k,m}$再計(jì)算對應(yīng)閾值。核心思想是——噪聲在CWT域中仍近似白噪聲其方差可用系數(shù)的局部統(tǒng)計(jì)量估計(jì)。常用方法中位絕對偏差MAD法對|W_{k,m}|的所有像素計(jì)算MAD median(| |W| - median(|W|) |)則 $\sigma \approx MAD / 0.6745$魯棒中位法取|W_{k,m}|的低百分位如第1%像素值作為噪聲基線再向上浮動(dòng)2~3倍我們推薦的混合策略兼顧魯棒性與效率def estimate_sigma_per_channel(magnitude_map, methodmad): 為單個(gè)CWT通道的模長圖估計(jì)噪聲標(biāo)準(zhǔn)差 :param magnitude_map: 2D array, |W_{k,m}(x,y)| :param method: mad or percentile :return: scalar sigma if method mad: # MAD法對所有像素計(jì)算MAD med np.median(magnitude_map) mad np.median(np.abs(magnitude_map - med)) sigma mad / 0.6745 else: # percentile法取1%分位數(shù)再乘系數(shù) p1 np.percentile(magnitude_map, 1) sigma p1 * 2.5 # 經(jīng)驗(yàn)系數(shù)可根據(jù)圖像類型微調(diào) return max(sigma, 1e-6) # 防止sigma為0 def adaptive_thresholding(cwt_result, methodmad, threshold_factor1.2): 對CWT結(jié)果進(jìn)行尺度-方向自適應(yīng)閾值 :param cwt_result: 4D complex array (S, T, H, W) :param method: 閾值估計(jì)方法 :param threshold_factor: 閾值放大系數(shù)1.0 :return: 閾值后的4D complex array S, T, H, W cwt_result.shape cwt_thresh np.zeros_like(cwt_result) for i in range(S): for j in range(T): mag np.abs(cwt_result[i, j]) sigma estimate_sigma_per_channel(mag, methodmethod) thresh threshold_factor * sigma # 軟閾值更平滑W_thresh sign(W) * max(|W| - thresh, 0) phase np.angle(cwt_result[i, j]) mag_thresh np.maximum(mag - thresh, 0) cwt_thresh[i, j] mag_thresh * (np.cos(phase) 1j * np.sin(phase)) return cwt_thresh # 應(yīng)用自適應(yīng)閾值 cwt_thresh adaptive_thresholding(cwt_out, methodmad, threshold_factor1.2)參數(shù)說明threshold_factor1.2是起點(diǎn)太小1.0去噪不足太大1.5易傷結(jié)構(gòu)。實(shí)際項(xiàng)目中我們總在1.1~1.3間微調(diào)用軟閾值而非硬閾值軟閾值讓系數(shù)平滑過渡到0避免硬截?cái)嘁爰妓拐疋廵stimate_sigma_per_channel中methodmad更魯棒percentile在強(qiáng)結(jié)構(gòu)圖像中更快因只算分位數(shù)。4.3 避坑Morlet CWT去噪的5個(gè)致命誤區(qū)與血淚經(jīng)驗(yàn)誤區(qū)1直接對復(fù)數(shù)系數(shù)做閾值忽略相位一致性現(xiàn)象去噪后圖像出現(xiàn)詭異的“彩虹色條紋”或大面積模糊。原因?qū)?fù)數(shù)W A*exp(iφ)直接W[W thresh] 0破壞了A和φ的耦合關(guān)系。當(dāng)A被置零但φ未同步清零逆變換時(shí)相位混亂。解決永遠(yuǎn)先算mag |W|閾值作用于mag再用原φ重建W_thresh mag_thresh * exp(iφ)。代碼中phase np.angle(...)正是為此。誤區(qū)2CWT后不做系數(shù)重構(gòu)以為模長圖就是去噪結(jié)果現(xiàn)象輸出的“去噪圖”全是彩色斑點(diǎn)完全不像原圖。原因CWT系數(shù)是中間表示不是圖像。必須通過小波逆變換ICWT把閾值后的系數(shù)映射回像素域。Morlet的ICWT有解析解但工程中更常用重構(gòu)核法下一章詳解。解決把cwt_thresh當(dāng)作新特征圖必須走完整重構(gòu)流程不可跳步。誤區(qū)3尺度數(shù)量太少3或太多8導(dǎo)致頻帶覆蓋不全現(xiàn)象小尺度噪聲沒壓住或大尺度結(jié)構(gòu)如器官輪廓被過度平滑。原因尺度序列應(yīng)覆蓋圖像的主要頻率成分。太少則頻帶缺口太多則計(jì)算爆炸且小尺度噪聲與大尺度結(jié)構(gòu)混疊。解決用對數(shù)尺度scales [2**i for i in range(min_power, max_power1)]。對512x512圖min_power1, max_power5即2,4,8,16,32是黃金組合。誤區(qū)4方向數(shù)固定為4忽視圖像內(nèi)容特異性現(xiàn)象處理文字掃描件時(shí)水平/垂直方向效果好但45°方向全是噪聲處理織物圖時(shí)45°/135°方向反而最關(guān)鍵。原因方向數(shù)應(yīng)與圖像主結(jié)構(gòu)方向匹配。通用圖選4方向0/45/90/135但若已知主方向如CT掃描線為水平可精簡為2方向0/90提速。解決先用cv2.Canny或梯度直方圖粗估主方向再定制thetas。誤區(qū)5忽略CWT的冗余性用conv2d后直接拼接導(dǎo)致內(nèi)存溢出現(xiàn)象cwt_out占用GB級內(nèi)存程序崩潰。原因CWT是冗余變換系數(shù)數(shù) 像素?cái)?shù)。4尺度×4方向×256×256 1MB但若用64尺度×8方向直接飆到16MB。解決用np.float32存儲(chǔ)模長重構(gòu)時(shí)再轉(zhuǎn)復(fù)數(shù)對每個(gè)尺度-方向單獨(dú)處理不用堆疊4D張量用dask.array或分塊計(jì)算對超大圖。5. 從CWT系數(shù)到去噪圖像Morlet逆變換ICWT的兩種落地路徑5.1 理論逆變換的困境為什么Morlet沒有完美解析ICWTMorlet小波不是正交基也不是雙正交基因此不存在嚴(yán)格的、能量守恒的解析逆變換公式。文獻(xiàn)中常寫的ICWT積分式$$ I(x,y) \frac{1}{C_\psi} \int_0^\infty \int_{-\infty}^\infty \int_{-\infty}^\infty W_{a,\theta}(x,y) , \psi_{a,\theta}\left(\frac{x-x}{a}, \frac{y-y}{a}\right) , dx dy \frac{da}{a^3} d\theta $$其中 $C_\psi$ 是容許性常數(shù)。但這個(gè)三重積分在離散圖像上無法精確實(shí)現(xiàn)連續(xù)尺度 $a$ 必須離散化引入近似誤差方向 $\theta$ 離散化后旋轉(zhuǎn)核的插值帶來失真數(shù)值積分精度受網(wǎng)格密度制約計(jì)算量爆炸。所以工程實(shí)踐必須妥協(xié)用重構(gòu)核Reconstruction Kernel替代理論ICWT。核心思想是——既然正向CWT是卷積那逆變換就該是某種“反卷積”而Morlet的重構(gòu)核就是其自身共軛翻轉(zhuǎn)conjugate and flip的歸一化版本。5.2 重構(gòu)核法Reconstruction Kernel Method穩(wěn)定、快速、可復(fù)現(xiàn)這是工業(yè)界首選方案。步驟清晰對每個(gè)尺度 $a_k$ 和方向 $\theta_m$生成其對應(yīng)的重構(gòu)核 $g_{a_k,\theta_m}(x,y) \frac{1}{a_k^2} \psi_{a_k,\theta_m}^*(-x,-y)$將閾值后的系數(shù) $W_{a_k,\theta_m}^{thresh}(x,y)$ 與 $g_{a_k,\theta_m}$ 做卷積對所有尺度-方向的結(jié)果求和再除以總能量歸一化因子。關(guān)鍵洞察由于Morlet是復(fù)數(shù)其重構(gòu)核必須是共軛翻轉(zhuǎn)不是簡單翻轉(zhuǎn)。代碼實(shí)現(xiàn)def reconstruction_kernel_2d(shape, scale, theta, omega05.0): 生成2D Morlet重構(gòu)核g(x,y) (1/a2) * ψ*(-x,-y) h, w shape y np.arange(-h//2, h//2).reshape(-1, 1) x np.arange(-w//2, w//2).reshape(1, -1) # 翻轉(zhuǎn)坐標(biāo)-x, -y u_flip (-x) * np.cos(theta) (-y) * np.sin(theta) v_flip -(-x) * np.sin(theta) (-y) * np.cos(theta) # 共軛exp(i*...) - exp(-i*...) psi_conj (np.pi**(-0.5) * np.exp(-1j * omega0 * u_flip / scale) * np.exp(-(u_flip**2 v_flip**2) / (2 * scale**2))) # 乘以1/a2歸一化 g (1.0 / (scale**2)) * psi_conj return g def icwt_reconstruct(cwt_thresh, scales, thetas, kernel_size33, image_shapeNone): 用重構(gòu)核法從閾值CWT系數(shù)重建圖像 :param cwt_thresh: 4D complex array (S, T, H, W) :param image_shape: 原圖尺寸 (H, W)用于初始化輸出 :return: 2D real array (H, W) S, T, H, W cwt_thresh.shape if image_shape is None: image_shape (H, W) # 初始化重建圖像 recon_img np.zeros(image_shape, dtypenp.complex128) # 對每個(gè)尺度-方向生成重構(gòu)核并卷積 for i, a in enumerate(scales): for j, theta in enumerate(thetas): # 生成重構(gòu)核 g reconstruction_kernel_2d((kernel_size, kernel_size), scalea, thetatheta) # 對該通道系數(shù)做卷積注意cwt_thresh[i,j]是復(fù)數(shù) conv_real ndimage.convolve(np.real(cwt_thresh[i, j]), np.real(g), modeconstant, cval0.0) conv_imag ndimage.convolve(np.imag(cwt_thresh[i, j]), np.imag(g), modeconstant, cval0.0) conv_complex conv_real 1j * conv_imag recon_img conv_complex # 歸一化除以總能量經(jīng)驗(yàn)系數(shù) # 理論上應(yīng)除以 C_psi但實(shí)踐中用均值歸一化更魯棒 recon_img np.real(recon_img) # 取實(shí)部虛部應(yīng)接近0 recon_img (recon_img - recon_img.min()) / (recon_img.max() - recon_img.min() 1e-8) return recon_img.astype(np.float32) # 執(zhí)行重構(gòu) denoised_img icwt_reconstruct(cwt_thresh, scales, thetas, kernel_size33, image_shapeimg.shape) print(fDenoised image shape: {denoised_img.shape}, dtype: {denoised_img.dtype})這段代碼的生存指南reconstruction_kernel_2d中u_flip/v_flip的推導(dǎo)必須嚴(yán)格任何坐標(biāo)符號錯(cuò)誤都會(huì)導(dǎo)致重構(gòu)圖像整體偏移或模糊ndimage.convolve再次被使用因?yàn)樗С謱?shí)數(shù)核與復(fù)數(shù)輸入的卷積實(shí)部/虛部分開算最終np.real(recon_img)是必須的——理論上虛部應(yīng)為0但數(shù)值誤差會(huì)殘留微小虛部歸一化用(x-min)/(max-min)而非除以C_psi因?yàn)镃_psi依賴于連續(xù)積分離散化后無精確值經(jīng)驗(yàn)歸一化更穩(wěn)定。5.3 驗(yàn)證去噪效果不止看PSNR更要盯住“結(jié)構(gòu)保真度”PSNR/SSIM是必要但不充分指標(biāo)。我們堅(jiān)持三個(gè)驗(yàn)證動(dòng)作殘差圖可視化residual |original - denoised|理想情況是殘差集中在噪聲位置結(jié)構(gòu)區(qū)域殘差≈0頻譜對比對原圖、去噪圖、殘差圖分別做2D FFT看高頻噪聲是否被壓制而中頻結(jié)構(gòu)頻譜是否保留關(guān)鍵結(jié)構(gòu)ROI放大檢查如CT中的血管分叉點(diǎn)、SAR中的道路交叉口手動(dòng)放大100%確認(rèn)邊緣是否銳利、無振鈴、無偽影。def validate_denoising(original, denoised, titleDenoising Validation): 三合一驗(yàn)證殘差圖、頻譜、ROI放大 residual np.abs(original - denoised) # 計(jì)算FFT中心化 fft_orig np.fft.fftshift(np.fft.fft2(original)) fft_deno np.fft.fftshift(np.fft.fft2(denoised)) fft_res np.fft.fftshift(np.fft.fft2(residual)) # ROI取中心64x64區(qū)域放大 h, w original.shape roi_orig original[h//2-32:h//232, w//2-32:w//232] roi_deno denoised[h//2-32:h//232, w//2-32:w//232] fig, axes plt.subplots(2, 3, figsize(15, 10)) # 行1原圖、去噪圖、殘差圖 axes[0,0].imshow(original, cmapgray); axes[0,0].set_title(Original) axes[0,1].imshow(denoised, cmapgray); axes[0,1].set_title(Denoised) im3 axes[0,2].imshow(residual, cmaphot); axes[0,2].set_title(Residual); plt.colorbar(im3, axaxes[0,2]) # 行2頻譜取log10(abs1)增強(qiáng)可視性 axes[1,0].imshow(np.log10(np.abs(fft_orig)1), cmapviridis); axes[1,0].set_title(FFT Original) axes[1,1].imshow(np.log10(np.abs(fft_deno)1), cmapviridis); axes p a hrefhttps://download.csdn.net/download/weixin_42696271/25533828 stylecolor:#ec7500;font-size:14px; 本文還有配套的精品資源點(diǎn)擊獲取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p