1import"../chunks/Bzak7iHL.js";import"../chunks/CVqN8KZA.js";import{f as xs,s as a,a as js,b as fs,$ as _s,d as s,r as n,n as o}from"../chunks/Cl5PMJAN.js";import{h as Ms}from"../chunks/Cs0vNk82.js";import{h as p}from"../chunks/BksfPUOh.js";import{s as Ls}from"../chunks/C20bAp0a.js";import{L as l}from"../chunks/EEYSa8Z7.js";import{L as Is}from"../chunks/BJ7jEeEl.js";import{I as e}from"../chunks/CWxp5MPb.js";import{M as t,F as Ds}from"../chunks/Xw_HQzUu.js";var qs=xs('<h1>CS 180 Project 2: Fun with Filters and Frequencies!</h1> <h4>Fall 2025 | Tim Xie | <!></h4> <!> <h2>part 1.1: convolutions from scratch</h2> <p><strong>Code Implementation</strong></p> <p>The 4 loop version is implemented without any array based operations.</p> <pre class="language-py"><!></pre> <p>The 2 loop version uses array slicing and array operations.</p> <pre class="language-py"><!></pre> <p>I made a helper which just flips on both axis</p> <pre class="language-py"><!></pre> <p><strong>Boundary Conditions, Padding, Runtime</strong></p> <p>I did a quick check to compare with <code>scipy.signal.convolve2d</code>, and ensured the functions return the same result. My implementation will pad with <span class="math math-inline"><!></span>s, handling boundary cases.</p> <br/> <p>It works with both no padding and pad to <code>"same"</code>:</p> <ul><li><code>conv2(x, k, pad=(0, 0))</code> returns the same result as <code>convolve2d(x, k, mode="valid", boundary="fill", fillvalue=0)</code>.</li> <li><code>conv2(x, k, pad=(ph, pw))</code> returns the same result as <code>convolve2d(x, k, mode="same", boundary="fill", fillvalue=0)</code>.</li></ul> <br/> <p>As for performance, I ran each convolution test 10000 times and as expected, the 4 loop implementation was slowe
1st, followed by the 2 loop version, and then the <code>scipy</code> implementation. I assume the <code>scipy</code> version is heavily optimised, and is hence much faster.</p> <table><thead><tr><th>Function</th><th>Time (s)</th></tr></thead><tbody><tr><td><code>conv2d</code> (4 loop)</td><td><span class="math math-inline"><!></span></td></tr><tr><td><code>conv2dfast</code> (2 loop)</td><td><span class="math math-inline"><!></span></td></tr><tr><td><code>scipy.signal.convolve2d</code></td><td><span class="math math-inline"><!></span></td></tr></tbody></table> <p>*<em>tested on zero padding, with size <span class="math math-inline"><!></span> matrices and size <span class="math math-inline"><!></span> kernels.</em></p> <br/> <p><strong>Results</strong></p> <p>Here are the results with my own convolution function.</p> <!> <p>*<em>the original image was converted to greyscale first.</em></p> <!> <h2>part 1.2: finite difference operators</h2> <!> <!> <!> <p>I used a threshold where <span class="math math-inline"><!></span> and found the best threshold to be</p> <div class="math math-display"><!></div> <p>If the threshold was too low, I was including too much noise (which can be seen in the <span class="math math-inline"><!></span> image). On the other hand, if the threshold was too high, the important edges itself were being removed (<span class="math math-inline"><!></span> image has many details on the camera stand removed).</p> <!> <h2>part 1.3: derivative of gaussian filter</h2> <p>I created the 2D gaussian by taking the outer product of a 1D gaussian with its transpose. We can see that the image is blurred after applying the kernel on the cameraman image.</p> <!> <p>The kernels look like the following</p> <!> <p><strong>Blurring with Dx, Dy</strong></p> <!> <p><strong>Using DoGx, DoGy</strong></p> <!> <p>We can see two yield identical results. I will show one set of partial x, partial y and gradient magnitude visualisations since both are identical.</p> <!> <p><strong>Comparison</strong></p> <p>We see that compared to the results without blurring, the lines here are thicker and the binarised image has less noise.</p> <!> <p>I chose the threshold to be only <span class="math math-inline"><!></span> since there is less noise, and this also shows the thicker lines. As you can see from the following thresholds, compared to before, <span class="math math-inline"><!></span> shows significantly less noise, and higher thresholds end up removing more detail.</p> <!> <!> <h2>part 2.1: image âsharpeningâ</h2> <p>I implemented the unsharp mask filter by adding to the image the high frequency features, effectively âboostingâ the sharpness by making the high frequency features more noticeable. We compute the unsharp mask filter by just subtracting the low-passed image from the original, and multiplying by a factor to increase these features.</p> <div class="math math-display"><!></div> <p>where <span class="math math-inline"><!></span> is the factor/amount to sharpen, <span class="math math-inline"><!></span> is the 2D impulse response function (all <span class="math math-inline"><!></span>s with a single <span class="math math-inline"><!></span> in the centre of the matrix). This is identical to taking the original image and subtracting from it the low-pass image, expanded out.</p> <p><strong>Taj</strong></p> <!> <!> <!> <br/> <p>We can see that increasing the lambda increases the perceived âsharpnessâ of the image, but overdoing it (<span class="math math-inline"><!></span>) yields some artefacting in the image.</p> <p><strong>Greece</strong></p> <!> <!> <!> <br/> <p>I chose this image because it had a variety of details, including large and small text. The sharpening worked surprisingly well in recovering most high frequency details in the image, only falling short at recovering the small text. This is understandable as the Gaussian has removed more details (relatively) since the text is small.</p> <!> <h2>part 2.2: hybrid images</h2> <p>I used <span class="math math-inline"><!></span> and <span class="math math-inline"><!></span> (low-pass, high-pass respectively) for all the following images.</p> <p><strong>Favourite Result</strong></p> <!> <!> <!> <!> <!> <!> <p><strong>Other Results</strong></p> <!> <!> <br/> <!> <!> <br/> <p>Unfortunately this did not turn out as well as I expected it to, but the effect still somewhat works!</p> <!> <h2>bells & whistles</h2> <p>I implemented this using colour, and found that using colour in the high-frequency image and greyscale in the low-frequency image works best!</p> <h2>part 2.3: gaussian & laplacian stacks</h2> <p>We use the apple and orange images provided to generate these stacks.<
1/p> <!> <p><strong>Gaussian stacks</strong></p> <!> <!> <p><strong>Laplacian stacks</strong></p> <!> <!> <!> <h2>part 2.4: multiresolution blending (the oraple!!)</h2> <p><strong>Blended image</strong></p> <!> <p><strong>Steps visualised</strong></p> <!> <!> <!> <p><strong>Extra images</strong></p> <p>I used photoshop to roughly align these images so the result is more convincing.</p> <br/> <p>(Photos taken on a Fuji X100VI)</p> <br/> <p>Done with a vertical join.</p> <br/> <!> <!> <!> <!> <!> <br/> <p>Done with a non-linear / elliptical mask.</p> <!> <!> <!> <!> <!> <!>',1);function Us(Ka){var F=qs();Ms(zs=>{_s.title="CS 180 Project 2"});var r=a(js(F),2);Ls(r,"",{},{"margin-top":"-2px","letter-spacing":"-3%"});var Na=a(s(r));Is(Na,{text:"https://xie.nz/180/proj2",href:"https://xie.nz/writing/classes/180/proj2",target:"_blank",small:!0}),n(r);var T=a(r,2);l(T,{});var c=a(T,8),Qa=s(c);p(Qa,()=>`<code class="language-py"><span class="token keyword">def</span> <span class="token function">conv2d</span><span class="token punctuation">(</span>im<span class="token punctuation">,</span> k<span class="token punctuation">,</span> pad<span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span> 2 ph<span class="token punctuation">,</span> pw <span class="token operator">=</span> pad 3 impad <span class="token operator">=</span> np<span class="token punctuation">.</span>pad<span class="token punctuation">(</span>im<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>ph<span class="token punctuation">,</span> ph<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>pw<span class="token punctuation">,</span> pw<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> 4 k <span class="token operator">=</span> flip2d<span class="token punctuation">(</span>k<span class="token punctuation">)</span> 5 6 h<span class="token punctuation">,</span> w <span class="token operator">=</span> im<span class="token punctuation">.</span>shape 7 kh<span class="token punctuation">,</span> kw <span class="token operator">=</span> k<span class="token punctuation">.</span>shape 8 h_out<span class="token punctuation">,</span> w_out <span class="token operator">=</span> h <span class="token operator">+</span> <span class="token number">2</span><span class="token operator">*</span>ph <span class="token operator">-</span> kh <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> w <span class="token operator">+</span> <span class="token number">2</span><span class="token operator">*</span>pw <span class="token operator">-</span> kw <span class="token operator">+</span> <span class="token number">1</span> 9 10 y <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>h_out<span class="token punctuation">,</span> w_out<span class="token punctuation">)</span><span class="token punctuation">)</span> 11 12 <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>h_out<span class="token punctuation">)</span><span class="token punctuation">:</span> 13 <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>w_out<span class="token punctuation">)</span><span class="token punctuation">:</span> 14 v <span class="token operator">=</span> <span class="token number">0</span> 15 16 <span class="token keyword">for</span> m <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>kh<span class="token punctuation">)</span><span class="token punctuation">:</span>
17 <span class="token keyword">for</span> n <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>kw<span class="token punctuation">)</span><span class="token punctuation">:</span> 18 v <span class="token operator">+=</span> k<span class="token punctuation">[</span>m<span class="token punctuation">,</span> n<span class="token punctuation">]</span> <span class="token operator">*</span> impad<span class="token punctuation">[</span>i <span class="token operator">+</span> m<span class="token punctuation">,</span> j <span class="token operator">+</span> n<span class="token punctuation">]</span> 19 20 y<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator">=</span> v 21 22 <span class="token keyword">return</span> y</code>`),n(c);var i=a(c,4),Ya=s(i);p(Ya,()=>`<code class="language-py"><span class="token keyword">def</span> <span class="token function">conv2dfast</span><span class="token punctuation">(</span>im<span class="token punctuation">,</span> k<span class="token punctuation">,</span> pad<span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span> 23 ph<span class="token punctuation">,</span> pw <span class="token operator">=</span> pad 24 impad <span class="token operator">=</span> np<span class="token punctuation">.</span>pad<span class="token punctuation">(</span>im<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>ph<span class="token punctuation">,</span> ph<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>pw<span class="token punctuation">,</span> pw<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> 25 k <span class="token operator">=</span> flip2d<span class="token punctuation">(</span>k<span class="token punctuation">)</span> 26 27 h<span class="token punctuation">,</span> w <span class="token operator">=</span> im<span class="token punctuation">.</span>shape 28 kh<span class="token punctuation">,</span> kw <span class="token operator">=</span> k<span class="token punctuation">.</span>shape 29 h_out<span class="token punctuation">,</span> w_out <span class="token operator">=</span> h <span class="token operator">+</span> <span class="token number">2</span><span class="token operator">*</span>ph <span class="token operator">-</span> kh <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> w <span class="token operator">+</span> <span class="token number">2</span><span class="token operator">*</span>pw <span class="token operator">-</span> kw <span class="token operator">+</span> <span class="token number">1</span> 30 31 y <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>h_out<span class="token punctuation">,</span> w_out<span class="token punctuation">)</span><span class="token punctuation">)</span> 32 33 <span class="token keyword">for</span> m <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>kh<span class="token punctuation">)</span><span class="token punctuation">:</span> 34 <span class="token keyword">for</span> n <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>kw<span class="token punctuation">)</span><span class="token punctuation">:</span> 35 y <span class="token operator">+=</span> k<span class="token punctuation">[</span>m<span class="token punctuation">,</span> n<span class="token punctuation">]</span> <span class="token operator">*</span> impad<span class="token punctuation">[</span>m<span class="token punctuation">:</span><span class="token punctuation">(</span>m <span class="token operator">+</span> h_out<span class="token punctuation">)</span><span class="token punctuation">,</span> n<span class="token punctuation">:</span><span class="token punctuation">(</span>n <span class="token operator">+</span> w_out<span class="token punctuation">)</span><span class="token punctuation">]</span> 36 37 <span class="token keyword">return</span> y</code>`),n(i);var m=a(i,4),Za=s(m);p(Za,()=>`<code class="language-py"><span class="token keyword">def</span> <span class="token function">flip2d</span><span class="token punctuation">(</span>k<span class="token punctuation">)</span><span class="token punctuation">:</span> 38 <span class="token keyword">return</span> np<span class="token punctuation">.</span>flip<span class="token punctuation">(</span>np<span class="token punctuation">.</span>flip<span class="token punctuation">(</span>k<span class="token punctuation">,</span> axis<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> axis<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span></code>`),n(m);var h=a(m,4),W=a(s(h),3),as=s(W);p(as,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>'),n(W),o(),n(h);var g=a(h,12),C=a(s(g)),d=s(C),B=a(s(d)),P=s(B),ss=s(P);p(ss,()=>
38'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.06</mn></mrow><annotation encoding="application/x-tex">1.06</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.06</span></span></span></span>'),n(P),n(B),n(d);var u=a(d),R=a(s(u)),$=s(R),ns=s($);p(ns,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.423</mn></mrow><annotation encoding="application/x-tex">0.423</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.423</span></span></span></span>'),n($),n(R),n(u);var S=a(u),U=a(s(S)),A=s(U),ts=s(A);p(ts,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.028</mn></mrow><annotation encoding="application/x-tex">0.028</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.028</span></span></span></span>'),n(A),n(U),n(S),n(C),n(g);var k=a(g,2),O=a(s(k)),v=a(s(O)),ps=s(v);p(ps,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>8</mn><mo separator="true">,</mo><mn>9</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(8, 9)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">8</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">9</span><span class="mclose">)</span></span></span></span>'),n(v);var X=a(v,2),es=s(X);p(es,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>5</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mclose">)</span></span></span></span>'),n(X),o(),n(O),n(k);var E=a(k,8);t(E,{images:[{src:"/180/proj2/1.1/orig.png",alt:"<h5>original</h5>"},{src:"/180/proj2/1.1/blur.png",alt:"<h5>
38with box filter</h5>"},{src:"/180/proj2/1.1/dx.png",alt:"<h5>dx</h5>"},{src:"/180/proj2/1.1/dy.png",alt:"<h5>dy</h5>"}]});var H=a(E,4);l(H,{dashed:!0});var V=a(H,4);t(V,{images:[{src:"/180/proj2/1.2/cameraman.png",alt:"<h5>cameraman</h5>"},{src:"/180/proj2/1.2/best.png",alt:"<h5>best binarised edge image</h5>"}]});var J=a(V,2);t(J,{images:[{src:"/180/proj2/1.2/dx.png",alt:"<h5>partial derivative in x</h5>"},{src:"/180/proj2/1.2/dy.png",alt:"<h5>partial derivative in y</h5>"},{src:"/180/proj2/1.2/gradient.png",alt:"<h5>gradient magnitude</h5>"}]});var K=a(J,2);t(K,{images:[{src:"/180/proj2/1.2/40.png",alt:"<h5>40</h5>"},{src:"/180/proj2/1.2/50.png",alt:"<h5>50</h5>"},{src:"/180/proj2/1.2/60.png",alt:"<h5>60</h5>"},{src:"/180/proj2/1.2/70.png",alt:"<h5>70</h5>"},{src:"/180/proj2/1.2/80.png",alt:"<h5>80</h5>"},{src:"/180/proj2/1.2/90.png",alt:"<h5>90</h5>"}]});var w=a(K,2),N=a(s(w)),os=s(N);p(os,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>gradient_magnitude</mtext><mo>â¥</mo><mtext>threshold</mtext></mrow><annotation encoding="application/x-tex">\\text{gradient\\_magnitude} \\geq \\text{threshold}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0044em;vertical-align:-0.31em;"></span><span class="mord text"><span class="mord">gradient_magnitude</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">â¥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">threshold</span></span></span></span></span>'),n(N),o(),n(w);var y=a(w,2),ls=s(y);p(ls,()=>'<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>threshold</mtext><mo>=</mo><mn>70</mn></mrow><annotation encoding="application/x-tex">\\text{threshold} = 70</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">threshold</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">70</span></span></span></span></span>'),n(y);var b=a(y,2),x=a(s(b)),rs=s(x);p(rs,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>threshold</mtext><mo>=</mo><mn>40</mn></mrow><annotation encoding="application/x-tex">\\text{threshold} = 40</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">threshold</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">40</span></span></span></span>'),n(x);var Q=a(x,2),cs=s(Q);p(cs,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>threshold</mtext><mo>=</mo><mn>90</mn></mrow><annotation encoding="application/x-tex">\\text{threshold} = 90</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">threshold</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">90</span></span></span></span>'),n(Q),o(),n(b);var Y=a(b,2);l(Y,{dashed:!0});var Z=a(Y,6);t(Z,{images:[{src:"/180/proj2/1.2/cameraman.png",alt:"<h5>cameraman</h5>"},{src:"/180/proj2/1.3/blurred.png",alt:"<h5>blurred cameraman</h5>"}]});var aa=a(Z,4);t(aa,{pixelated:!0,images:[{src:"/180/proj2/1.3/g2d.png",alt:"<h5>2D Gaussian</h5>"},{src:"/180/proj2/1.3/dogx.png",alt:"<h5>DoGx</h5>"},{src:"/180/proj2/1.3/dogy.png",alt:"<h5>DoGy</h5>"}]});var sa=a(aa,4);e(sa,{images:{src:"/180/proj2/1.3/method2.png",alt:"<h5>
38Blurring, then using Dx, Dy</h5>"}});var na=a(sa,4);e(na,{images:{src:"/180/proj2/1.3/method2.png",alt:"<h5>Using DoGx, DoGy</h5>"}});var ta=a(na,4);t(ta,{pixelated:!0,images:[{src:"/180/proj2/1.3/dx.png",alt:"<h5>partial derivative in x</h5>"},{src:"/180/proj2/1.3/dy.png",alt:"<h5>partial derivative in y</h5>"},{src:"/180/proj2/1.3/gradient-magnitude.png",alt:"<h5>gradient magnitude</h5>"}]});var pa=a(ta,6);t(pa,{images:[{src:"/180/proj2/1.2/best.png",alt:"<h5>without blurring</h5>"},{src:"/180/proj2/1.3/method1.png",alt:"<h5>with blurring</h5>"}]});var j=a(pa,2),f=a(s(j)),is=s(f);p(is,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>45</mn></mrow><annotation encoding="application/x-tex">45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span>'),n(f);var ea=a(f,2),ms=s(ea);p(ms,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>40</mn></mrow><annotation encoding="application/x-tex">40</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">40</span></span></span></span>'),n(ea),o(),n(j);var oa=a(j,2);t(oa,{images:[{src:"/180/proj2/1.3/40.png",alt:"<h5>40</h5>"},{src:"/180/proj2/1.3/50.png",alt:"<h5>50</h5>"},{src:"/180/proj2/1.3/60.png",alt:"<h5>60</h5>"},{src:"/180/proj2/1.3/70.png",alt:"<h5>70</h5>"},{src:"/180/proj2/1.3/80.png",alt:"<h5>80</h5>"},{src:"/180/proj2/1.3/90.png",alt:"<h5>90</h5>"}]});var la=a(oa,2);l(la,{dashed:!1});var _=a(la,6),hs=s(_);p(hs,()=>'<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>unsharp filter</mtext><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>λ</mi><mo stretchy="false">)</mo><mo>â
</mo><mi>δ</mi><mo>â</mo><mi>λ</mi><mo>â
</mo><mi>G</mi></mrow><annotation encoding="application/x-tex">\\text{unsharp filter} = (1 + \\lambda) \\cdot \\delta - \\lambda \\cdot G</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">unsharp filter</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">λ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">â
</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">â</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">λ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">â
</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span></span></span></span></span>'),n(_);var M=a(_,2),L=a(s(M)),gs=s(L);p(gs,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>λ</mi></mrow><annotation encoding="application/x-tex">\\lambda</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">λ</span></span></span></span>'),n(L);var I=a(L,2),ds=s(I);p(ds,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>δ</mi></mrow><annotation encoding="application/x-tex">\\delta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span></span></span></span>'),n(I);var D=a(I,2),us=s(D);p(us,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>'),n(D);var ra=a(D,2),ks=s(ra);p(ks,()=>
38'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>'),n(ra),o(),n(M);var ca=a(M,4);t(ca,{images:[{src:"/180/proj2/2.1/taj.png",alt:"<h5>taj</h5>"},{src:"/180/proj2/2.1/lowfreq.png",alt:"<h5>low frequency details</h5>"}]});var ia=a(ca,2);t(ia,{images:[{src:"/180/proj2/2.1/highfreq.png",alt:"<h5>high frequency details</h5>"},{src:"/180/proj2/2.1/sharpened.png",alt:"<h5>sharpened, lambda = 1.5</h5>"}]});var ma=a(ia,2);t(ma,{images:[{src:"/180/proj2/2.1/taj1.png",alt:"<h5>lambda = 1</h5>"},{src:"/180/proj2/2.1/taj4.png",alt:"<h5>lambda = 4</h5>"},{src:"/180/proj2/2.1/taj8.png",alt:"<h5>lambda = 8</h5>"}]});var q=a(ma,4),ha=a(s(q)),vs=s(ha);p(vs,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>λ</mi><mo>></mo><mn>4</mn></mrow><annotation encoding="application/x-tex">\\lambda > 4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">λ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>'),n(ha),o(),n(q);var ga=a(q,4);t(ga,{images:[{src:"/180/proj2/2.1/greece.png",alt:"<h5>taj</h5>"},{src:"/180/proj2/2.1/greece-lp.png",alt:"<h5>blurred</h5>"}]});var da=a(ga,2);t(da,{images:[{src:"/180/proj2/2.1/greece-hp.png",alt:"<h5>high frequency details</h5>"},{src:"/180/proj2/2.1/greece1.5.png",alt:"<h5>sharpened, lambda = 1.5</h5>"}]});var ua=a(da,2);t(ua,{images:[{src:"/180/proj2/2.1/greece1.png",alt:"<h5>lambda = 1</h5>"},{src:"/180/proj2/2.1/greece4.png",alt:"<h5>lambda = 4</h5>"},{src:"/180/proj2/2.1/greece8.png",alt:"<h5>lambda = 8</h5>"}]});var ka=a(ua,6);l(ka,{dashed:!0});var z=a(ka,4),G=a(s(z)),ws=s(G);p(ws,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Ï</mi><mn>1</mn></msub><mo>=</mo><mn>8</mn></mrow><annotation encoding="application/x-tex">\\sigma_1 = 8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">Ï</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">â</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">8</span></span></span></span>'),n(G);var va=a(G,2),ys=s(va);p(ys,()=>'<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Ï</mi><mn>2</mn></msub><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">\\sigma_2 = 3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">Ï</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">â</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>'),n(va),o(),n(z);var wa=a(z,4);
38e(wa,{images:{src:"/180/proj2/2.2/hybrid2-final.png",alt:"<h5>final</h>"}});var ya=a(wa,2);t(ya,{images:[{src:"/180/proj2/2.2/hybrid2-chicken.png",alt:""},{src:"/180/proj2/2.2/hybrid2-dog.png",alt:""}]});var ba=a(ya,2);t(ba,{images:[{src:"/180/proj2/2.2/hybrid2-chicken-aligned.png",alt:""},{src:"/180/proj2/2.2/hybrid2-dog-aligned.png",alt:""}]});var xa=a(ba,2);t(xa,{images:[{src:"/180/proj2/2.2/hybrid2-chicken-fft.png",alt:"<h5>chicken fft</h5>"},{src:"/180/proj2/2.2/hybrid2-dog-fft.png",alt:"<h5>dog fft</h5>"}]});var ja=a(xa,2);t(ja,{images:[{src:"/180/proj2/2.2/hybrid2-low.png",alt:"<h5>low frequencies</h5>"},{src:"/180/proj2/2.2/hybrid2-high.png",alt:"<h5>high frequencies</h5>"}]});var fa=a(ja,2);e(fa,{images:{src:"/180/proj2/2.2/hybrid2-combined.png",alt:"<h5>final fft</h>"}});var _a=a(fa,4);e(_a,{images:{src:"/180/proj2/2.2/hybrid1-final.png",alt:"<h5>final</h>"}});var Ma=a(_a,2);t(Ma,{images:[{src:"/180/proj2/2.2/hybrid1-person.jpg",alt:""},{src:"/180/proj2/2.2/hybrid1-cat.jpg",alt:""}]});var La=a(Ma,4);e(La,{images:{src:"/180/proj2/2.2/hybrid3-final.png",alt:"<h5>final</h>"}});var Ia=a(La,2);t(Ia,{images:[{src:"/180/proj2/2.2/hybrid3-ch.png",alt:""},{src:"/180/proj2/2.2/hybrid3-bk.png",alt:""}]});var Da=a(Ia,6);l(Da,{dashed:!0});var qa=a(Da,10);t(qa,{images:[{src:"/180/proj2/2.3/apple.jpeg",alt:"<h5>apple</h5>"},{src:"/180/proj2/2.3/orange.jpeg",alt:"<h5>orange</h5>"}]});var za=a(qa,4);t(za,{images:[{src:"/180/proj2/2.3/apple0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/apple1.png",alt:""},{src:"/180/proj2/2.3/apple2.png",alt:""},{src:"/180/proj2/2.3/apple3.png",alt:""},{src:"/180/proj2/2.3/apple4.png",alt:""},{src:"/180/proj2/2.3/apple5.png",alt:"<h5>level 5</h5>"}]});var Ga=a(za,2);t(Ga,{images:[{src:"/180/proj2/2.3/orange0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/orange1.png",alt:""},{src:"/180/proj2/2.3/orange2.png",alt:""},{src:"/180/proj2/2.3/orange3.png",alt:""},{src:"/180/proj2/2.3/orange4.png",alt:""},{src:"/180/proj2/2.3/orange5.png",alt:"<h5>level 5</h5>"}]});var Fa=a(Ga,4);t(Fa,{images:[{src:"/180/proj2/2.3/lap-apple0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/lap-apple1.png",alt:""},{src:"/180/proj2/2.3/lap-apple2.png",alt:""},{src:"/180/proj2/2.3/lap-apple3.png",alt:""},{src:"/180/proj2/2.3/lap-apple4.png",alt:""},{src:"/180/proj2/2.3/lap-apple5.png",alt:"<h5>level 5</h5>"}]});var Ta=a(Fa,2);t(Ta,{images:[{src:"/180/proj2/2.3/lap-orange0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/lap-orange1.png",alt:""},{src:"/180/proj2/2.3/lap-orange2.png",alt:""},{src:"/180/proj2/2.3/lap-orange3.png",alt:""},{src:"/180/proj2/2.3/lap-orange4.png",alt:""},{src:"/180/proj2/2.3/lap-orange5.png",alt:"<h5>level 5</h5>"}]});var Wa=a(Ta,2);l(Wa,{dashed:!0});var Ca=a(Wa,6);e(Ca,{images:{src:"/180/proj2/2.3/blended.png",alt:"<h5>oraple!</h>"}});var Ba=a(Ca,4);t(Ba,{images:[{src:"/180/proj2/2.3/half1-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/half1-1.png",alt:""},{src:"/180/proj2/2.3/half1-2.png",alt:""},{src:"/180/proj2/2.3/half1-3.png",alt:""},{src:"/180/proj2/2.3/half1-4.png",alt:""},{src:"/180/proj2/2.3/half1-5.png",alt:"<h5>level 5</h5>"}]});var Pa=a(Ba,2);t(Pa,{images:[{src:"/180/proj2/2.3/half2-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/half2-1.png",alt:""},{src:"/180/proj2/2.3/half2-2.png",alt:""},{src:"/180/proj2/2.3/half2-3.png",alt:""},{src:"/180/proj2/2.3/half2-4.png",alt:""},{src:"/180/proj2/2.3/half2-5.png",alt:"<h5>level 5</h5>"}]});var Ra=a(Pa,2);t(Ra,{images:[{src:"/180/proj2/2.3/combined-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/combined-1.png",alt:""},{src:"/180/proj2/2.3/combined-2.png",alt:""},{src:"/180/proj2/2.3/combined-3.png",alt:""},{src:"/180/proj2/2.3/combined-4.png",alt:""},{src:"/180/proj2/2.3/combined-5.png",alt:"<h5>level 5</h5>"}]});var $a=a(Ra,16);t($a,{images:[{src:"/180/proj2/2.4/blend1-calc.png",alt:""},{src:"/180/proj2/2.4/blend1-phone.png",alt:""}]});var Sa=a($a,2);e(Sa,{images:{src:"/180/proj2/2.4/blend1.png",alt:"<h5>phone? calc? phonlc?</h>"}});var Ua=a(Sa,2);t(Ua,{images:[{src:"/180/proj2/2.3/phalf1-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/phalf1-1.png",alt:""},{src:"/180/proj2/2.3/phalf1-2.png",alt:""},{src:"/180/proj2/2.3/phalf1-3.png",alt:""},{src:"/180/proj2/2.3/phalf1-4.png",alt:""},{src:"/180/proj2/2.3/phalf1-5.png",alt:"<h5>level 5</h5>"}]});var Aa=a(Ua,2);t(Aa,{images:[{src:"/180/proj2/2.3/phalf2-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/phalf2-1.png",alt:""},{src:"/180/proj2/2.3/phalf2-2.png",alt:""},{src:"/180/proj2/2.3/phalf2-3.png",alt:""},{src:"/180/proj2/2.3/phalf2-4.png",alt:""},{src:"/180/proj2/2.3/phalf2-5.png",alt:"<h5>level 5</h5>"}]});var Oa=a(Aa,2);t(Oa,{images:[{src:"/180/proj2/2.3/pcombined-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/pcombined-1.png",alt:""},{src:"/180/proj2/2.3/pcombined-2.png",alt:""},{src:"/180/proj2/2.3/pcombined-3.png",alt:""},{src:"/180/proj2/2.3/pcombined-4.png",alt:""},{src:"/180/proj2/2.3/pcombined-5.png",alt:"<h5>level 5</h5>"}]});var Xa=a(Oa,6);t(Xa,{images:[{src:"/180/proj2/2.4/blend2-mac.png",alt:""},{src:"/180/proj2/2.4/blend2-keeb.png",alt:""}]});var Ea=a(Xa,2);e(Ea,{images:{src:"/180/proj2/2.4/blend2.png",alt:"<h5>a better mac keyboard</h>"}});var Ha=a(Ea,2);t(Ha,{images:[{src:"/180/proj2/2.3/nhalf1-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/nhalf1-1.png",alt:""},{src:"/180/proj2/2.3/nhalf1-2.png",alt:""},{src:"/180/proj2/2.3/nhalf1-3.png",alt:""},{src:"/180/proj2/2.3/nhalf1-4.png",alt:""},{src:"/180/proj2/2.3/nhalf1-5.png",alt:"<h5>level 5</h5>"}]});var Va=a(Ha,2);t(Va,{images:[{src:"/180/proj2/2.3/nhalf2-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/nhalf2-1.png",alt:""},{src:"/180/proj2/2.3/nhalf2-2.png",alt:""},{src:"/180/proj2/2.3/nhalf2-3.png",alt:""},{src:"/180/proj2/2.3/nhalf2-4.png",alt:""},{src:"/180/proj2/2.3/nhalf2-5.png",alt:"<h5>level 5</h5>"}]});var Ja=a(Va,2);t(Ja,{images:[{src:"/180/proj2/2.3/ncombined-0.png",alt:"<h5>level 0</h5>"},{src:"/180/proj2/2.3/ncombined-1.png",alt:""},{src:"/180/proj2/2.3/ncombined-2.png",alt:""},{src:"/180/proj2/2.3/ncombined-3.png",alt:""},{src:"/180/proj2/2.3/ncombined-4.png",alt:""},{src:"/180/proj2/2.3/ncombined-5.png",alt:"<h5>level 5</h5>"}]});var bs=a(Ja,2);Ds(bs,{date:"27/09/2025"}),fs(Ka,F)}export{Us as component};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.