s3.py
import%20marimo%0A%0A__generated_with%20%3D%20%220.19.11%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20matplotlib%2C%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20plt.ion()%3B%0A%20%20%20%20return%20(plt%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20return%20(np%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20skimage%20import%20io%0A%20%20%20%20from%20skimage.filters%20import%20gaussian%2C%20median%2C%20threshold_otsu%0A%0A%20%20%20%20return%20gaussian%2C%20io%2C%20median%2C%20threshold_otsu%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20scipy.ndimage%20as%20ndi%0A%0A%20%20%20%20return%20(ndi%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20mo.pdf(src%3DPath(%22Homework3.pdf%22)%2C%20width%3D%22100%25%22%2C%20height%3D%2250vh%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Convolution%20and%20Filtering%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(io)%3A%0A%20%20%20%20escher_relativity_png%20%3D%20io.imread(%22escher-relativity.png%22%2C%20as_gray%3DTrue)%0A%20%20%20%20return%20(escher_relativity_png%2C)%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png%2C%20plt)%3A%0A%20%20%20%20fig1%2C%20ax1%20%3D%20plt.subplots()%0A%20%20%20%20p1%20%3D%20ax1.imshow(escher_relativity_png%2C%20cmap%3D%22gray%22)%0A%20%20%20%20cbar1%20%3D%20fig1.colorbar(p1%2C%20ax%3Dax1)%0A%20%20%20%20fig1%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20avgker11%20%3D%20np.ones((11%2C%2011))%20%2F%20np.square(11)%0A%20%20%20%20return%20(avgker11%2C)%0A%0A%0A%40app.cell%0Adef%20_(avgker11%2C%20escher_relativity_png%2C%20ndi)%3A%0A%20%20%20%20escher_relativity_png_avgd_const%20%3D%20ndi.convolve(escher_relativity_png%2C%20avgker11%2C%20mode%3D%22constant%22)%0A%20%20%20%20escher_relativity_png_avgd_miror%20%3D%20ndi.convolve(escher_relativity_png%2C%20avgker11%2C%20mode%3D%22mirror%22)%0A%20%20%20%20return%20escher_relativity_png_avgd_const%2C%20escher_relativity_png_avgd_miror%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png_avgd_const%2C%20escher_relativity_png_avgd_miror%2C%20plt)%3A%0A%20%20%20%20fig2%2C%20(ax2a%2C%20ax2b)%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20p2a%20%3D%20ax2a.imshow(escher_relativity_png_avgd_const%2C%20cmap%3D%22gray%22)%0A%20%20%20%20p2b%20%3D%20ax2b.imshow(escher_relativity_png_avgd_miror%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig2.colorbar(p2a%2C%20ax%3Dax2a)%0A%20%20%20%20fig2.colorbar(p2b%2C%20ax%3Dax2b)%0A%20%20%20%20fig2%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Gaussian%20Filtering%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20def%20gaussker(sgm2%2C%20shape%3D(11%2C%2011))%3A%0A%20%20%20%20%20%20%20%20xs%2C%20ys%20%3D%20np.meshgrid(np.arange(shape%5B0%5D)%2C%20np.arange(shape%5B1%5D))%0A%20%20%20%20%20%20%20%20r2s%20%3D%20np.square(xs%20-%20shape%5B0%5D%20%2F%2F%202)%20%2B%20np.square(ys%20-%20shape%5B0%5D%20%2F%2F%202)%0A%20%20%20%20%20%20%20%20e%20%3D%20np.exp(-%20r2s%20%2F%20(2%20*%20sgm2))%0A%20%20%20%20%20%20%20%20return%20e%20%2F%20np.sum(e)%20%20%23%20return%20normalized%20kernel%0A%0A%20%20%20%20return%20(gaussker%2C)%0A%0A%0A%40app.cell%0Adef%20_(gaussker%2C%20plt)%3A%0A%20%20%20%20fig3%2C%20(ax3a%2C%20ax3b)%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20p3a%20%3D%20ax3a.imshow(gaussker(3))%0A%20%20%20%20p3b%20%3D%20ax3b.imshow(gaussker(7))%0A%20%20%20%20fig3.colorbar(p3a%2C%20ax%3Dax3a)%0A%20%20%20%20fig3.colorbar(p3b%2C%20ax%3Dax3b)%0A%20%20%20%20fig3%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png%2C%20gaussker%2C%20ndi)%3A%0A%20%20%20%20escher_relativity_png_gaussd3%20%3D%20ndi.convolve(escher_relativity_png%2C%20gaussker(3))%0A%20%20%20%20escher_relativity_png_gaussd7%20%3D%20ndi.convolve(escher_relativity_png%2C%20gaussker(7))%0A%20%20%20%20return%20escher_relativity_png_gaussd3%2C%20escher_relativity_png_gaussd7%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png_gaussd3%2C%20escher_relativity_png_gaussd7%2C%20plt)%3A%0A%20%20%20%20fig4%2C%20(ax4a%2C%20ax4b)%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20p4a%20%3D%20ax4a.imshow(escher_relativity_png_gaussd3%2C%20cmap%3D%22gray%22)%0A%20%20%20%20p4b%20%3D%20ax4b.imshow(escher_relativity_png_gaussd7%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig4.colorbar(p4a%2C%20ax%3Dax4a)%0A%20%20%20%20fig4.colorbar(p4b%2C%20ax%3Dax4b)%0A%20%20%20%20fig4%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png%2C%20gaussian%2C%20np)%3A%0A%20%20%20%20escher_relativity_png_gaussdsk7%20%3D%20gaussian(escher_relativity_png%2C%20np.sqrt(7))%0A%20%20%20%20return%20(escher_relativity_png_gaussdsk7%2C)%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png_gaussdsk7%2C%20plt)%3A%0A%20%20%20%20fig5%2C%20ax5%20%3D%20plt.subplots()%0A%20%20%20%20p5%20%3D%20ax5.imshow(escher_relativity_png_gaussdsk7%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig5.colorbar(p5%2C%20ax%3Dax5)%0A%20%20%20%20fig5%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png_gaussd7%2C%20escher_relativity_png_gaussdsk7%2C%20np)%3A%0A%20%20%20%20escher_relativity_png_skdiff%20%3D%20escher_relativity_png_gaussdsk7%20-%20escher_relativity_png_gaussd7%0A%20%20%20%20escher_relativity_png_skdiff%20%3D%20escher_relativity_png_skdiff%20-%20np.min(escher_relativity_png_skdiff)%0A%20%20%20%20return%20(escher_relativity_png_skdiff%2C)%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png_skdiff%2C%20plt)%3A%0A%20%20%20%20fig6%2C%20ax6%20%3D%20plt.subplots()%0A%20%20%20%20p6%20%3D%20ax6.imshow(escher_relativity_png_skdiff%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig6.colorbar(p6%2C%20ax%3Dax6)%0A%20%20%20%20fig6%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Median%20Filtering%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png%2C%20median%2C%20np)%3A%0A%20%20%20%20escher_relativity_png_median7%20%3D%20median(escher_relativity_png%2C%20np.ones((7%2C%207)))%0A%20%20%20%20return%20(escher_relativity_png_median7%2C)%0A%0A%0A%40app.cell%0Adef%20_(escher_relativity_png_median7%2C%20plt)%3A%0A%20%20%20%20fig7%2C%20ax7%20%3D%20plt.subplots()%0A%20%20%20%20p7%20%3D%20ax7.imshow(escher_relativity_png_median7%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig7.colorbar(p7%2C%20ax%3Dax7)%0A%20%20%20%20fig7%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Filtering%20and%20Thresholding%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(io)%3A%0A%20%20%20%20makeup_richardprince_1983_gray_png%20%3D%20io.imread(%22MakeUp_RichardPrince_1983_gray.png%22%2C%20as_gray%3DTrue)%0A%20%20%20%20return%20(makeup_richardprince_1983_gray_png%2C)%0A%0A%0A%40app.cell%0Adef%20_(makeup_richardprince_1983_gray_png%2C%20plt)%3A%0A%20%20%20%20fig8%2C%20ax8%20%3D%20plt.subplots()%0A%20%20%20%20p8%20%3D%20ax8.imshow(makeup_richardprince_1983_gray_png%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig8.colorbar(p8%2C%20ax%3Dax8)%0A%20%20%20%20fig8%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(gaussian%2C%20makeup_richardprince_1983_gray_png%2C%20np%2C%20threshold_otsu)%3A%0A%20%20%20%20makeup_richardprince_1983_gray_png_gaussian%20%3D%20255%20*%20gaussian(makeup_richardprince_1983_gray_png%2C%20np.sqrt(51))%0A%20%20%20%20makeup_richardprince_1983_gray_png_gaussian_gthreshold%20%3D%20threshold_otsu(makeup_richardprince_1983_gray_png_gaussian)%0A%20%20%20%20makeup_richardprince_1983_gray_png_gaussian_threshd%20%3D%20makeup_richardprince_1983_gray_png_gaussian%20%3E%20makeup_richardprince_1983_gray_png_gaussian_gthreshold%0A%20%20%20%20return%20(makeup_richardprince_1983_gray_png_gaussian_threshd%2C)%0A%0A%0A%40app.cell%0Adef%20_(makeup_richardprince_1983_gray_png%2C%20median%2C%20np%2C%20threshold_otsu)%3A%0A%20%20%20%20makeup_richardprince_1983_gray_png_median%20%3D%20median(makeup_richardprince_1983_gray_png%2C%20np.ones((51%2C%2051)))%0A%20%20%20%20makeup_richardprince_1983_gray_png_median_gthreshold%20%3D%20threshold_otsu(makeup_richardprince_1983_gray_png_median)%0A%20%20%20%20makeup_richardprince_1983_gray_png_median_threshd%20%3D%20makeup_richardprince_1983_gray_png_median%20%3E%20makeup_richardprince_1983_gray_png_median_gthreshold%0A%20%20%20%20return%20(makeup_richardprince_1983_gray_png_median_threshd%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20makeup_richardprince_1983_gray_png_gaussian_threshd%2C%0A%20%20%20%20makeup_richardprince_1983_gray_png_median_threshd%2C%0A%20%20%20%20plt%2C%0A)%3A%0A%20%20%20%20fig9%2C%20(ax9a%2C%20ax9b)%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20p9a%20%3D%20ax9a.imshow(makeup_richardprince_1983_gray_png_gaussian_threshd%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig9.colorbar(p9a%2C%20ax%3Dax9a)%0A%20%20%20%20p9b%20%3D%20ax9b.imshow(makeup_richardprince_1983_gray_png_median_threshd%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig9.colorbar(p9b%2C%20ax%3Dax9b)%0A%20%20%20%20fig9%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20High-pass%20Filtering%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(io)%3A%0A%20%20%20%20elevator_to_the_gallows_png%20%3D%20io.imread(%22Elevator_to_the_gallows.png%22%2C%20as_gray%3DTrue)%0A%20%20%20%20return%20(elevator_to_the_gallows_png%2C)%0A%0A%0A%40app.cell%0Adef%20_(elevator_to_the_gallows_png%2C%20plt)%3A%0A%20%20%20%20fig10%2C%20ax10%20%3D%20plt.subplots()%0A%20%20%20%20ax10.imshow(elevator_to_the_gallows_png%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig10%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(gaussian%2C%20np)%3A%0A%20%20%20%20def%20gausshighpass(image%2C%20sigma%3Dnp.sqrt(7))%3A%0A%20%20%20%20%20%20%20%20gaussd%20%3D%20(np.max(image)%20-%20np.min(image))%20*%20gaussian(image%2C%20sigma)%0A%20%20%20%20%20%20%20%20diff%20%3D%20image%20-%20gaussd%0A%20%20%20%20%20%20%20%20diff%20%3D%20diff%20-%20np.min(diff)%0A%20%20%20%20%20%20%20%20return%20(255%20%2F%20np.max(diff))%20*%20diff%0A%0A%20%20%20%20return%20(gausshighpass%2C)%0A%0A%0A%40app.cell%0Adef%20_(elevator_to_the_gallows_png%2C%20gausshighpass)%3A%0A%20%20%20%20elevator_to_the_gallows_png_highpass%20%3D%20gausshighpass(elevator_to_the_gallows_png%2C%20sigma%3D21)%0A%20%20%20%20return%20(elevator_to_the_gallows_png_highpass%2C)%0A%0A%0A%40app.cell%0Adef%20_(elevator_to_the_gallows_png_highpass%2C%20plt)%3A%0A%20%20%20%20fig11%2C%20ax11%20%3D%20plt.subplots()%0A%20%20%20%20ax11.imshow(elevator_to_the_gallows_png_highpass%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig11%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(elevator_to_the_gallows_png_highpass%2C%20threshold_otsu)%3A%0A%20%20%20%20elevator_to_the_gallows_png_highpass_threshold%20%3D%20threshold_otsu(elevator_to_the_gallows_png_highpass)%0A%20%20%20%20elevator_to_the_gallows_png_highthresh%20%3D%20elevator_to_the_gallows_png_highpass%20%3E%20elevator_to_the_gallows_png_highpass_threshold%0A%20%20%20%20return%20(elevator_to_the_gallows_png_highthresh%2C)%0A%0A%0A%40app.cell%0Adef%20_(elevator_to_the_gallows_png_highthresh%2C%20plt)%3A%0A%20%20%20%20fig12%2C%20ax12%20%3D%20plt.subplots()%0A%20%20%20%20ax12.imshow(elevator_to_the_gallows_png_highthresh%2C%20cmap%3D%22gray%22)%0A%20%20%20%20fig12%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Band-pass%20Filtering%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(io)%3A%0A%20%20%20%20gaussians_s2_to_s50_px_tif%20%3D%20io.imread(%22gaussians_s2_to_s50_px.tif%22%2C%20as_gray%3DTrue)%0A%20%20%20%20return%20(gaussians_s2_to_s50_px_tif%2C)%0A%0A%0A%40app.cell%0Adef%20_(gaussians_s2_to_s50_px_tif%2C%20plt)%3A%0A%20%20%20%20fig13%2C%20(ax13a%2C%20ax13b)%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20ax13a.imshow(gaussians_s2_to_s50_px_tif%2C%20cmap%3D%22gray%22)%0A%20%20%20%20ax13a.hlines(1240%2C%200%2C%203200%2C%20color%3D%22magenta%22)%0A%20%20%20%20ax13b.plot(gaussians_s2_to_s50_px_tif%5B1240%2C%20%3A%5D)%0A%20%20%20%20fig13%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(gaussian%2C%20np)%3A%0A%20%20%20%20def%20gausslowpass(image%2C%20sigma%3Dnp.sqrt(7))%3A%0A%20%20%20%20%20%20%20%20gaussd%20%3D%20(np.max(image)%20-%20np.min(image))%20*%20gaussian(image%2C%20sigma)%0A%20%20%20%20%20%20%20%20return%20(255%20%2F%20np.max(gaussd))%20*%20gaussd%0A%0A%20%20%20%20return%20(gausslowpass%2C)%0A%0A%0A%40app.cell%0Adef%20_(gausshighpass%2C%20gaussians_s2_to_s50_px_tif%2C%20gausslowpass)%3A%0A%20%20%20%20gaussians_s2_to_s50_px_tif_bandpassed%20%3D%20gausslowpass(gausshighpass(%0A%20%20%20%20%20%20%20%20gaussians_s2_to_s50_px_tif%2C%20%0A%20%20%20%20%20%20%20%20sigma%3D20)%2C%20sigma%3D10)%0A%20%20%20%20return%20(gaussians_s2_to_s50_px_tif_bandpassed%2C)%0A%0A%0A%40app.cell%0Adef%20_(gaussians_s2_to_s50_px_tif_bandpassed%2C%20plt)%3A%0A%20%20%20%20fig14%2C%20(ax14a%2C%20ax14b)%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20ax14a.imshow(gaussians_s2_to_s50_px_tif_bandpassed%2C%20cmap%3D%22gray%22)%0A%20%20%20%20ax14a.hlines(1240%2C%200%2C%203200%2C%20color%3D%22magenta%22)%0A%20%20%20%20ax14b.plot(gaussians_s2_to_s50_px_tif_bandpassed%5B1240%2C%20%3A%5D)%0A%20%20%20%20fig14%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Signal%20to%20Noise%20Ratio%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20rng%20%3D%20np.random.default_rng()%0A%20%20%20%20def%20sim_image(r%2C%20b%3D2%2C%20t%3D2%2C%20size%3D(27%2C%2027))%3A%0A%20%20%20%20%20%20%20%20bg%20%3D%20rng.poisson(lam%3Db%20*%20t%2C%20size%3Dsize)%0A%20%20%20%20%20%20%20%20sg%20%3D%20np.zeros_like(bg)%0A%20%20%20%20%20%20%20%20sg%5Bsg.shape%5B0%5D%20%2F%2F%202%2C%20sg.shape%5B1%5D%20%2F%2F%202%5D%20%3D%20rng.poisson(lam%3Dr*t)%0A%20%20%20%20%20%20%20%20return%20bg%20%2B%20sg%0A%0A%20%20%20%20return%20(sim_image%2C)%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20sim_image)%3A%0A%20%20%20%20fig15%2C%20(ax15a%2C%20ax15b%2C%20ax15c)%20%3D%20plt.subplots(1%2C%203%2C%20figsize%3D(10%2C%204))%0A%20%20%20%20ax15a.imshow(sim_image(2%2C%20t%3D1)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20ax15b.imshow(sim_image(6%2C%20t%3D1)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20ax15c.imshow(sim_image(10%2C%20t%3D1)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20sim_image)%3A%0A%20%20%20%20exposure_sims%20%3D%20%5B%20sim_image(0.5%2C%20t%3Dt)%20for%20t%20in%20range(0%2C%20300)%20%5D%0A%20%20%20%20sns%20%3D%20%5Bs%5B27%2F%2F2%2C%2027%2F%2F2%5D%20%2F%20np.std(s)%20for%20s%20in%20exposure_sims%5D%20%20%0A%20%20%20%20return%20(sns%2C)%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20sns)%3A%0A%20%20%20%20fig16%2C%20ax16%20%3D%20plt.subplots()%0A%20%20%20%20ax16.scatter(range(0%2C%20300)%2C%20sns)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20A%20little%20bit%20of%20Fourier%20Transforming%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(io)%3A%0A%20%20%20%20Lincoln_Coleman_png%20%3D%20io.imread(%22Lincoln_Coleman_40-copyright-havecamerawilltravel-com_crop512_gray.png%22%2C%20as_gray%3DTrue)%0A%20%20%20%20return%20(Lincoln_Coleman_png%2C)%0A%0A%0A%40app.cell%0Adef%20_(Lincoln_Coleman_png%2C%20plt)%3A%0A%20%20%20%20fig17%2C%20ax17%20%3D%20plt.subplots()%0A%20%20%20%20ax17.imshow(Lincoln_Coleman_png%2C%20cmap%3D%22grey%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20%25load%20fourier_masking_HWproblem.py%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(io%2C%20np%2C%20plt)%3A%0A%20%20%20%20%23%20%25load%20fourier_masking_HWproblem.py%0A%20%20%20%20%23%20fourier_masking_HWproblem.py%0A%20%20%20%20%22%22%22%0A%20%20%20%20Author%3A%20%20%20Raghuveer%20Parthasarathy%0A%20%20%20%20Created%20on%20Tue%20Oct%20%208%2007%3A25%3A53%202024%0A%20%20%20%20Last%20modified%20on%20Oct.%2012%2C%202024%0A%0A%20%20%20%20Description%0A%20%20%20%20-----------%0A%0A%20%20%20%20For%20a%20homework%20problem%20on%20masking%20Fourier%20Transforms%0A%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20%23import%20numpy%20as%20np%0A%20%20%20%20%23import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20os%0A%20%20%20%20%23from%20skimage%20import%20io%20%20%23%20input%20output%20sub-package%0A%0A%0A%20%20%20%20%23%20%25%25%20Load%20the%20image%0A%0A%20%20%20%20parentDir%20%3D%20r%22.%2F%22%0A%20%20%20%20fileName%20%3D%20r%22Lincoln_Coleman_40-copyright-havecamerawilltravel-com_crop512_gray.png%22%0A%0A%20%20%20%20im%20%3D%20io.imread(os.path.join(parentDir%2C%20fileName))%0A%0A%20%20%20%20if%20im.ndim%20%3E%202%3A%0A%20%20%20%20%20%20%20%20%23%20A%20bit%20silly%2C%20since%20I%20know%20this%20is%202D%0A%20%20%20%20%20%20%20%20im%20%3D%20np.mean(im%2C%20axis%3D2%2C%20dtype%3Dim.dtype)%0A%0A%20%20%20%20print(%22Image%20shape%3A%20%22%2C%20im.shape)%0A%20%20%20%20%23%20Image%20size%3B%20I'm%20not%20checking%20if%20it's%20square!%0A%20%20%20%20%23%20The%20Lincoln%20Memorial%20image%20is%20512x512%0A%20%20%20%20N%20%3D%20im.shape%5B0%5D%0A%0A%20%20%20%20plt.figure()%0A%20%20%20%20plt.imshow(im%2C%20%22gray%22)%0A%20%20%20%20plt.title(%22Original%20Image%22)%0A%0A%20%20%20%20%23%20%25%25%20Fourier%20Transform%0A%0A%20%20%20%20%23%20Perform%202D%20Fourier%20transform%0A%20%20%20%20F%20%3D%20np.fft.fft2(im)%20%20%23%20Fast%20Fourier%20Transform%0A%20%20%20%20F_shifted%20%3D%20np.fft.fftshift(F)%20%20%23%20Shift%20so%20zero%20frequency%20is%20in%20the%20center%0A%0A%20%20%20%20%23%20Calculate%20the%20amplitude%20and%20phase%0A%20%20%20%20amplitude%20%3D%20np.abs(F_shifted)%0A%20%20%20%20phase%20%3D%20np.angle(F_shifted)%0A%0A%20%20%20%20%23%20Display%20amplitude%20as%20an%20image%0A%20%20%20%20plt.figure()%0A%20%20%20%20plt.title(%22Fourier%20Transform%20Amplitude%20(log%20scale)%22)%0A%20%20%20%20%23%20Should%20maybe%20add%20an%20offset%20to%20avoid%20-Inf%2C%0A%20%20%20%20%23%20but%20I've%20tested%20and%20there%20are%20no%20zeros.%0A%20%20%20%20plt.imshow(np.log(amplitude)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20plt.colorbar()%0A%20%20%20%20plt.show()%0A%0A%20%20%20%20%23%20Display%20phase%20as%20an%20image%0A%20%20%20%20plt.figure()%0A%20%20%20%20plt.title(%22Fourier%20Transform%20Phase%20(radians)%22)%0A%20%20%20%20plt.imshow(phase)%0A%20%20%20%20plt.colorbar()%0A%20%20%20%20plt.show()%0A%0A%20%20%20%20%23%20%25%25%20Masking%0A%0A%20%20%20%20%23%20%22Fundamental%20frequency%22%20for%20the%20mask%0A%20%20%20%20f0%20%3D%2015%20%20%23%20I%20determined%20this%20%22by%20hand%22%0A%20%20%20%20%23%20Full%20width%20of%20the%20mask%20--%20should%20be%20an%20even%20number%0A%20%20%20%20df%20%3D%204%0A%0A%20%20%20%20%23%20Create%20a%20mask%20array%0A%20%20%20%20mask%20%3D%20np.ones((N%2C%20N))%0A%20%20%20%20for%20k%20in%20range(1%2C%20N%20%2F%2F%20(2%20*%20f0))%3A%0A%20%20%20%20%20%20%20%20center_f%20%3D%20N%20%2F%202%20%2B%20k%20*%20f0%0A%20%20%20%20%20%20%20%20mask%5B%3A%2C%20int(center_f%20-%20df%20%2F%202)%20%3A%20int(center_f%20%2B%20df%20%2F%202)%5D%20%3D%200%0A%20%20%20%20%20%20%20%20center_f%20%3D%20N%20%2F%202%20-%20k%20*%20f0%0A%20%20%20%20%20%20%20%20mask%5B%3A%2C%20int(center_f%20-%20df%20%2F%202)%20%3A%20int(center_f%20%2B%20df%20%2F%202)%5D%20%3D%200%0A%0A%20%20%20%20%23%20Create%20a%20new%20amplitude%20array%20that%20is%20the%20original%20multiplied%20by%20this%20mask%0A%20%20%20%20new_amplitude%20%3D%20amplitude%20*%20mask%0A%20%20%20%20%23%20new_amplitude%20%3D%20amplitude%20*%20(1.0%20-%20mask)%20%23%20show%20just%20the%20*difference*!%0A%0A%20%20%20%20%23%20Display%20the%20new%20amplitude%20as%20an%20image%0A%20%20%20%20plt.figure()%0A%20%20%20%20plt.title(%22Amplitude%20*%20Mask%22)%0A%20%20%20%20plt.imshow(np.log(new_amplitude%20%2B%200.1)%2C%20cmap%3D%22gray%22)%20%20%23%20%2B%200.1%20because%20of%20zeros.%0A%20%20%20%20plt.colorbar()%0A%20%20%20%20plt.show()%0A%0A%0A%20%20%20%20%23%20Combine%20new%20amplitude%20with%20original%20phase%0A%20%20%20%20new_F_shifted%20%3D%20new_amplitude%20*%20np.exp(1j%20*%20phase)%0A%0A%20%20%20%20%23%20Perform%20the%20inverse%20Fourier%20transform%0A%20%20%20%20new_F%20%3D%20np.fft.ifftshift(new_F_shifted)%0A%20%20%20%20new_im%20%3D%20np.fft.ifft2(new_F)%0A%20%20%20%20new_im%20%3D%20np.abs(new_im)%0A%0A%20%20%20%20%23%20Display%20the%20resulting%20image%0A%20%20%20%20plt.figure()%0A%20%20%20%20plt.title(%22Image%20based%20on%20Inverse%20FT%22)%0A%20%20%20%20plt.imshow(new_im%2C%20cmap%3D%22gray%22)%0A%20%20%20%20plt.colorbar()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A 765f56e949c691f14919b0629776a9e2