فصل ۷ | موجک از فوریه تا تحلیل تصویر¶
این دفترچه از دادهٔ مصنوعی استفاده میکند. برای هر بخش ابتدا مفهوم را بخوانید، بعد نتیجه را اجرا و تفسیر کنید.
۱. هار یکبعدی — دو خروجی به چه معناست؟¶
a خلاصهٔ سطح هر دو نمونه و d اختلاف آنهاست. تقسیم بر $\sqrt{2}$ برای حفظ انرژی است. اکنون خودتان چهار عدد را تغییر دهید.
import numpy as np
import matplotlib.pyplot as plt
from chapter07_wavelet_core import (
dwt_haar_1d, idwt_haar_1d, dwt_haar_2d, idwt_haar_2d,
synthetic_image, multilevel_haar_2d, inverse_multilevel_haar_2d,
wavelet_denoise, cwt_mexican_hat, soft_threshold
)
x = np.array([4.,6.,8.,10.])
a1, d1 = dwt_haar_1d(x)
a2, d2 = dwt_haar_1d(a1)
print("a1:", a1, "d1:",d1)
print("a2:", a2, "d2:",d2)
print("Energy: input=",sum(x**2), "all wavelet coefficients=",sum(a2**2)+sum(d2**2)+sum(d1**2))
assert np.allclose(idwt_haar_1d(a1,d1),x)
a1: [ 7.07106781 12.72792206] d1: [-1.41421356 -1.41421356] a2: [14.] d2: [-4.] Energy: input= 216.0 all wavelet coefficients= 215.99999999999994
۲. CWT به زبان قابل مشاهده¶
با جابهجا کردن یک رخداد کوتاه در ورودی، نقشهٔ اسکالوگرام نیز جابهجا میشود. محور افقی مکان و محور عمودی مقیاس است؛ مقیاس همان فرکانس هرتزی نیست.
signal = np.zeros(256)
signal[46:53] = 2
signal[186:193] = 2
scales = np.arange(3,36)
coeff = cwt_mexican_hat(signal, scales)
fig,ax = plt.subplots(2,1,figsize=(9,6))
ax[0].plot(signal);ax[0].set_title("Two short events")
im=ax[1].imshow(np.abs(coeff),origin="lower",aspect="auto",extent=[0,256,3,35])
ax[1].set(xlabel="Position",ylabel="Scale",title="Sampled CWT magnitudes")
plt.colorbar(im,ax=ax[1]);plt.tight_layout();plt.show()
۳. DWT دوبعدی — چهار خروجی¶
LL تقریب، H ساختارهای افقی، V ساختارهای عمودی و D جزئیات مرکب را اندازه میگیرند. دادهٔ ورودی تصویری مصنوعی است.
image = synthetic_image(256)
LL, H, V, D = dwt_haar_2d(image)
fig, axs = plt.subplots(2,2,figsize=(8,7))
for ax,z,title in zip(axs.ravel(), [LL,V,H,D],["LL coarse","V vertical","H horizontal","D diagonal"]):
ax.imshow(z,cmap="gray" if title.startswith("LL") else "coolwarm")
ax.set_title(title);ax.axis("off")
plt.tight_layout();plt.show()
print("Original:",image.shape,"each subband:",LL.shape)
Original: (256, 256) each subband: (128, 128)
۴. چندسطحی و بازسازی دقیق¶
فقط LL هر سطح به سطح بعدی میرود؛ تمام جزئیات حفظ میشوند.
coarse, detail_levels = multilevel_haar_2d(image,levels=3)
restored = inverse_multilevel_haar_2d(coarse,detail_levels)
err = np.max(np.abs(restored-image))
energy_coeff = sum(np.sum(b**2) for group in detail_levels for b in group)+np.sum(coarse**2)
print("Coarsest approximation:",coarse.shape)
print("Max reconstruction error:",err)
print("Energy input:",np.sum(image**2),"energy coeff:",energy_coeff)
assert err < 1e-10
assert np.isclose(energy_coeff,np.sum(image**2))
Coarsest approximation: (32, 32) Max reconstruction error: 3.410605131648481e-13 Energy input: 1421821494.8076677 energy coeff: 1421821494.8076668
۵. حذف نویز موجکی — آستانه باید ارزیابی شود¶
از خود تصویر تمیز و نویز تصادفی با دانهٔ ثابت استفاده میکنیم. این آزمایش آموزشی است و ادعای برتری عمومی ندارد.
rng = np.random.default_rng(42)
noisy = np.clip(image+rng.normal(0,20,image.shape),0,255)
denoised = wavelet_denoise(noisy,levels=3,threshold=22)
mse_noisy=np.mean((noisy-image)**2)
mse_clean=np.mean((denoised-image)**2)
print("Noisy MSE:",mse_noisy,"Denoised MSE:",mse_clean)
fig, axs=plt.subplots(1,3,figsize=(12,4))
for ax,z,title in zip(axs,[image,noisy,denoised],["Clean synthetic","Noisy","Wavelet denoised"]):
ax.imshow(z,cmap="gray",vmin=0,vmax=255);ax.set_title(title);ax.axis("off")
plt.tight_layout();plt.show()
Noisy MSE: 398.34702716449624 Denoised MSE: 68.92820804784299
۶. انتخاب آستانه به کمک MSE¶
برای همین دادهٔ مصنوعی میتوان مقدار بهینهٔ تجربی را دید. در دادهٔ واقعی بدون مرجع تمیز، MSE مرجع در دسترس نیست.
thresholds=np.arange(0,61,5)
errors=np.array([np.mean((wavelet_denoise(noisy,3,float(t))-image)**2) for t in thresholds])
print("Best threshold in this grid:",thresholds[np.argmin(errors)],"best MSE:",min(errors))
plt.figure(figsize=(8,3.5));plt.plot(thresholds,errors,"o-");plt.axhline(mse_noisy,ls="--",color="red")
plt.xlabel("Threshold");plt.ylabel("MSE");plt.title("One controlled synthetic test");plt.show()
Best threshold in this grid: 40 best MSE: 40.88751080729645
۷. جمعبندی آزمون¶
اگر دو assert بالای دفترچه پاس شدند، پیادهسازی آموزشی هار در این دادهها بازسازی دقیق و حفظ انرژی را نشان داده است؛ آزمایش آستانهگذاری عمداً بااتلاف است.
assert np.allclose(idwt_haar_1d(*dwt_haar_1d(np.arange(32))),np.arange(32))
assert np.allclose(idwt_haar_2d(*dwt_haar_2d(np.arange(64).reshape(8,8))),np.arange(64).reshape(8,8))
print("ALL TESTS PASSED")
ALL TESTS PASSED