فصل ۷ | موجک از فوریه تا تحلیل تصویر¶

این دفترچه از دادهٔ مصنوعی استفاده می‌کند. برای هر بخش ابتدا مفهوم را بخوانید، بعد نتیجه را اجرا و تفسیر کنید.

۱. هار یک‌بعدی — دو خروجی به چه معناست؟¶

a خلاصهٔ سطح هر دو نمونه و d اختلاف آن‌هاست. تقسیم بر $\sqrt{2}$ برای حفظ انرژی است. اکنون خودتان چهار عدد را تغییر دهید.

In [1]:
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 به زبان قابل مشاهده¶

با جابه‌جا کردن یک رخداد کوتاه در ورودی، نقشهٔ اسکالوگرام نیز جابه‌جا می‌شود. محور افقی مکان و محور عمودی مقیاس است؛ مقیاس همان فرکانس هرتزی نیست.

In [2]:
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()
No description has been provided for this image

۳. DWT دوبعدی — چهار خروجی¶

LL تقریب، H ساختارهای افقی، V ساختارهای عمودی و D جزئیات مرکب را اندازه می‌گیرند. دادهٔ ورودی تصویری مصنوعی است.

In [3]:
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)
No description has been provided for this image
Original: (256, 256) each subband: (128, 128)

۴. چندسطحی و بازسازی دقیق¶

فقط LL هر سطح به سطح بعدی می‌رود؛ تمام جزئیات حفظ می‌شوند.

In [4]:
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

۵. حذف نویز موجکی — آستانه باید ارزیابی شود¶

از خود تصویر تمیز و نویز تصادفی با دانهٔ ثابت استفاده می‌کنیم. این آزمایش آموزشی است و ادعای برتری عمومی ندارد.

In [5]:
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
No description has been provided for this image

۶. انتخاب آستانه به کمک MSE¶

برای همین دادهٔ مصنوعی می‌توان مقدار بهینهٔ تجربی را دید. در دادهٔ واقعی بدون مرجع تمیز، MSE مرجع در دسترس نیست.

In [6]:
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
No description has been provided for this image

۷. جمع‌بندی آزمون¶

اگر دو assert بالای دفترچه پاس شدند، پیاده‌سازی آموزشی هار در این داده‌ها بازسازی دقیق و حفظ انرژی را نشان داده است؛ آزمایش آستانه‌گذاری عمداً بااتلاف است.

In [7]:
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