<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JaeTech</title>
    <link>https://faceyourfear.tistory.com/</link>
    <description>재박이의 테크블로그</description>
    <language>ko</language>
    <pubDate>Sun, 12 Jul 2026 02:45:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>재바기</managingEditor>
    <image>
      <title>JaeTech</title>
      <url>https://tistory1.daumcdn.net/tistory/4474565/attach/2f398e6d077a4193890e1714fe1a2055</url>
      <link>https://faceyourfear.tistory.com</link>
    </image>
    <item>
      <title>우분투 에어팟 연결 에러 해결</title>
      <link>https://faceyourfear.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우분투에서 에어팟 연결할 때 말썽인 경우가 많은데 아래와 같이 따라하면 간단하게 해결할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ sudo vim /etc/bluetooth/main.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 통해 파일수정을 들어가면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8WeMi/btsI0xAV8Vr/BQsrN8dgxhGrEsjkbc3Du1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8WeMi/btsI0xAV8Vr/BQsrN8dgxhGrEsjkbc3Du1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8WeMi/btsI0xAV8Vr/BQsrN8dgxhGrEsjkbc3Du1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8WeMi%2FbtsI0xAV8Vr%2FBQsrN8dgxhGrEsjkbc3Du1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;326&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 뜰 텐데, vim의 검색기능을 통해 /ControllerMode 로 찾으면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHogY/btsI0zyxA9y/cqwCnXk1xxYyj7KzUtsEw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHogY/btsI0zyxA9y/cqwCnXk1xxYyj7KzUtsEw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHogY/btsI0zyxA9y/cqwCnXk1xxYyj7KzUtsEw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHogY%2FbtsI0zyxA9y%2FcqwCnXk1xxYyj7KzUtsEw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;78&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 캡쳐화면처럼 ControllerMode 를 설정할 수 있는 라인을 발견할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# ControllerMode = dual
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 아마 되어있을텐데, 이를 위의 사진과 같이 bredr로 바꿔주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:wq를 통해 저장하고나서&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;$ sudo /etc/init.d/bluetooth restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 바뀐 설정으로 재시작을 해주고 나면 에어팟 연결이 정상적으로 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <category>Airpods</category>
      <category>ubuntu</category>
      <category>블루투스</category>
      <category>에어팟</category>
      <category>우분투</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/86</guid>
      <comments>https://faceyourfear.tistory.com/86#entry86comment</comments>
      <pubDate>Sun, 11 Aug 2024 18:54:31 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu에서 Filezilla3 설치</title>
      <link>https://faceyourfear.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파일질라 공식사이트에서 tar.xz 파일 받고 압축해제하면 bin파일로 실행하는 방식인데, 바이너리 파일이 에러 뜰 때가 많길래 그냥 터미널 커맨드로 앱을 받는 게 더 편하고 안정성이 높은 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 설치가능.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ sudo apt update
$ sudo apt upgrade
$ sudo add-apt-repository ppa:xtradeb/apps
$ sudo apt update
$ sudo apt install filezilla
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1933&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv62sn/btsI1Qy2nUB/pcBrrlsgxANT56hU07oXKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv62sn/btsI1Qy2nUB/pcBrrlsgxANT56hU07oXKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv62sn/btsI1Qy2nUB/pcBrrlsgxANT56hU07oXKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv62sn%2FbtsI1Qy2nUB%2FpcBrrlsgxANT56hU07oXKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;194&quot; height=&quot;188&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1933&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <category>filezilla3</category>
      <category>ubuntu</category>
      <category>우분투</category>
      <category>파일질라</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/85</guid>
      <comments>https://faceyourfear.tistory.com/85#entry85comment</comments>
      <pubDate>Sun, 11 Aug 2024 15:10:27 +0900</pubDate>
    </item>
    <item>
      <title>dlopen(): error loading libfuse.so.2 에러 해결</title>
      <link>https://faceyourfear.tistory.com/84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPt9og/btsI05XWpt8/UccqD3ZFKnhWqb2TQZmgQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPt9og/btsI05XWpt8/UccqD3ZFKnhWqb2TQZmgQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPt9og/btsI05XWpt8/UccqD3ZFKnhWqb2TQZmgQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPt9og%2FbtsI05XWpt8%2FUccqD3ZFKnhWqb2TQZmgQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;490&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스의 경우 AppImage 형태의 프로그램을 실행하기 위해서는 fuse2 라는 라이브러리가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 위와 같이&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;dlopen(): error loading libfuse.so.2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 에러가 뜨는 경우에는 fuse2 라이브러리를 설치해주기만 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;$ sudo apt install libfuse2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgxJX6/btsI1fF2rJY/I1HVAQ0zjKZHrBnJEeYXak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgxJX6/btsI1fF2rJY/I1HVAQ0zjKZHrBnJEeYXak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgxJX6/btsI1fF2rJY/I1HVAQ0zjKZHrBnJEeYXak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgxJX6%2FbtsI1fF2rJY%2FI1HVAQ0zjKZHrBnJEeYXak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;865&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/84</guid>
      <comments>https://faceyourfear.tistory.com/84#entry84comment</comments>
      <pubDate>Sun, 11 Aug 2024 15:04:04 +0900</pubDate>
    </item>
    <item>
      <title>MeshLab 설치 및 에러 해결</title>
      <link>https://faceyourfear.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SuGaR로 돌려본 결과를 rendering 하려고 여러 툴을 찾아보다가 교수님께서 MeshLab을 추천해주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Install 방법을 구글링해봤는데 처음 찾았던 게&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ sudo apt update
$ sudo apt install meshlab&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거였고, 정상적으로 MeshLab 설치는 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 import Mesh 를 해보니 계속 .obj 파일이 열리다말고 프로그램이 꺼졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우 Ubuntu 22.04를 쓰고 있는데 22.04 에서는 이런 문제가 생길 수 있다고 해서 다른 방법으로 install을 진행해보니 정상적으로 작동이 됐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTnMcM/btsHgf3DYNA/Yk2lKLNslTmsSoXQFQ4OFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTnMcM/btsHgf3DYNA/Yk2lKLNslTmsSoXQFQ4OFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTnMcM/btsHgf3DYNA/Yk2lKLNslTmsSoXQFQ4OFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTnMcM%2FbtsHgf3DYNA%2FYk2lKLNslTmsSoXQFQ4OFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;875&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MeshLab 홈페이지에서 Linux AppImage를 눌러 설치를 받고,&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ chmod a+x MeshLab2023.12-linux.AppImage
$ ./MeshLab2023.12-linux.AppImage
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 앱이미지를 실행해주니 .obj 파일이 정상적으로 import 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가는 도움이 되었길 바라며.&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <category>MeshLab</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/83</guid>
      <comments>https://faceyourfear.tistory.com/83#entry83comment</comments>
      <pubDate>Thu, 9 May 2024 00:25:17 +0900</pubDate>
    </item>
    <item>
      <title>두 개의 dataloader에서 에서 tqdm 쓰는 법</title>
      <link>https://faceyourfear.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;tqdm을 사용하기 위해선 tqdm의 인자로 들어오는 게 __len__ 메소드를 가져야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, tqdm안에 아래와 같이&lt;/p&gt;
&lt;pre id=&quot;code_1680947694110&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i, data in tqdm(enumerate(zip(train_dataloader1, train_dataloader2)))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 쓰면 안되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;__len__을 가지는 train_dataloader1이나 train_dataloader2 중 하나를 tqdm으로 감싼다.(어차피 둘의 크기는 같을 것이므로)&lt;/p&gt;
&lt;pre id=&quot;code_1680947794544&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i, data in enumerate(zip(tqdm(train_dataloader1), train_dataloader2)):&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해주면 정상적으로 작동한다.&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <category>삽질</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/81</guid>
      <comments>https://faceyourfear.tistory.com/81#entry81comment</comments>
      <pubDate>Sat, 8 Apr 2023 18:56:57 +0900</pubDate>
    </item>
    <item>
      <title>학습 시 두 개 이상의 데이터셋에서 batch 뽑아내는 법</title>
      <link>https://faceyourfear.tistory.com/80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;종종 model의 input으로 두 개의 데이터가 들어갈 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, dataloader도 각각 따로 필요할 수가 있고, 그로 인해 enumerate 함수의 인자를 어떻게 전달해야 할 지 헷갈릴 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 때는 다음과 같이 enumerate안에 zip으로 두 dataloader를 묶어서 사용해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1680947398302&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    model.train()
    for epoch in range(num_epoch):
        print('EPOCH {}:'.format(epoch + 1))
        training_loss = 0.0
        for i, data in enumerate(zip(train_dataloader1, train_dataloader2)):
            # get the inputs; data is a list of [inputs, labels]
            data1, data2 = data
            input1, labels1 = data1
            input2, labels2 = data2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 enumerate안에서 두 dataloader를 zip하면 enumerate가 각각의 dataloader에서 batch를 잘 stack해서 전달해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 주의할 점은 이 때 enumerate의 리턴값으로 나오는 출력값이 조금 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i 와 같이 index의 경우는 그대로 0부터 시작하지만, data는 두 dataloader에서 나오는 data가 합쳐져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 data를 data1과 data2로 나눠주고, 이를 다시 input과 label로 나눠주면 된다.&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <category>삽질</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/80</guid>
      <comments>https://faceyourfear.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 8 Apr 2023 18:52:35 +0900</pubDate>
    </item>
    <item>
      <title>Edge detection</title>
      <link>https://faceyourfear.tistory.com/78</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Edge detection&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edge detection이란 뭘까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQ3Z8/btr77gaS5jx/OPU3sh2Qo0HT5dGXvw6wO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQ3Z8/btr77gaS5jx/OPU3sh2Qo0HT5dGXvw6wO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQ3Z8/btr77gaS5jx/OPU3sh2Qo0HT5dGXvw6wO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQ3Z8%2Fbtr77gaS5jx%2FOPU3sh2Qo0HT5dGXvw6wO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;323&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edge detection은 2D image를 curve의 set으로 변환하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 해당 scene 또는 object의 가장 두드러지고 핵심적인 feature를 추출하는 것이라고 할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그렇다면 왜 edge를 사용하는 걸까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 edge는 빛과 색깔에 비교적 robust하기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ysQWu/btr77Pqvfpe/r4AhASthoyDtf5qpAD745K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ysQWu/btr77Pqvfpe/r4AhASthoyDtf5qpAD745K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ysQWu/btr77Pqvfpe/r4AhASthoyDtf5qpAD745K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FysQWu%2Fbtr77Pqvfpe%2Fr4AhASthoyDtf5qpAD745K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;232&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 위와 같이 색깔이 다른 같은 모델의 자동차는 비슷한 edge feature를 가지고 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 edge는 recognition과 이미지의 patch들을 matching하는 데 유용하게 쓸 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 edge에 대해서 조금 고민해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNhN7S/btr77f34A7I/kjGrPqODMLdVav2QWquUO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNhN7S/btr77f34A7I/kjGrPqODMLdVav2QWquUO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNhN7S/btr77f34A7I/kjGrPqODMLdVav2QWquUO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNhN7S%2Fbtr77f34A7I%2FkjGrPqODMLdVav2QWquUO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;248&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edge는 위의 그림과 같이 단순히 하나의 이유만으로 생기는 것이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깊이가 달라서, 색깔이 달라서, 조명이 달라서 등등 여러 원인에 의해 생길 수 있는 것이 바로 edge이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 image filtering에서 우리는 image를 function으로 생각할 수 있다고 했었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBoqCx/btr8gWoOyBL/UCksT6RBI2WsRFzdIO879k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBoqCx/btr8gWoOyBL/UCksT6RBI2WsRFzdIO879k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBoqCx/btr8gWoOyBL/UCksT6RBI2WsRFzdIO879k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBoqCx%2Fbtr8gWoOyBL%2FUCksT6RBI2WsRFzdIO879k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;285&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림과 같이, edge는 steep cliffs(가파른 절벽)처럼 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇듯 intensity의 값이 확 바뀌는 부분을 우리는 edge라고 생각해 볼 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Characterizing edges&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말했듯, edge는 image intensity function의 값이 급격하게 바뀌는 부분이라고 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuGjby/btr8eXaJFGK/9Be2LnRaSz7tuqOvd2Qz0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuGjby/btr8eXaJFGK/9Be2LnRaSz7tuqOvd2Qz0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuGjby/btr8eXaJFGK/9Be2LnRaSz7tuqOvd2Qz0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuGjby%2Fbtr8eXaJFGK%2F9Be2LnRaSz7tuqOvd2Qz0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;343&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 좌측 그림을 본래 image라고 한다면, intensity는 중간 그림처럼 해당 부분에서(horizontal 방향을 따라) 아래로 급격히 떨어졌다가 다시 오르는 형태를 띄게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 intensity function을 미분해보면, 우측 그림처럼 미분의 값이 가장 extreme한 곳(극값)이 edge라고 할 수 있을 것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Image derivatives&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 여기서 하나 문제점이 발생하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;image intensity function의 정의역은 discrete하며, 어떤 특정한 수학적인 함수로 정의할 수 없기 때문에, 미분을 어떻게 해주어야 할지 고민할 수 밖에 없다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 이 digital image $F[x,y]$를 어떻게 differentiate할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론, 이 digital image를다시 continuous한 image 로 바꿔서 미분을 해볼 수도 있겠으나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;discrete derivative를 적용하는 방법이 더 간단하고 직관적이다. (finite difference)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \dfrac{\partial f}{\partial x}[x,y]\approx F[x+1,y]-F[x,y] $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 위의 식처럼 $x$방향으로 1만큼 옆에 있는 픽셀과의 pixel intensity차이를 이용하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이렇게 구현한 linear filter은 아래와 같이 이루어진다. (비어있는 칸 0)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCiOpL/btr8f1jENye/fX9PKixB1KMKseJP6bLXNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCiOpL/btr8f1jENye/fX9PKixB1KMKseJP6bLXNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCiOpL/btr8f1jENye/fX9PKixB1KMKseJP6bLXNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCiOpL%2Fbtr8f1jENye%2FfX9PKixB1KMKseJP6bLXNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;190&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 filter를 적용하면 $F[x-1,y]-F[x,y]$ 가 되지 않느냐고 헷갈릴 수도 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;convolution 연산을 적용하는 것이기 때문에, $F[x+1,y]-F[x,y]$ 이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 $y$축 방향은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \dfrac{\partial f}{\partial x}[x,y]\approx F[x,y+1]-F[x,y] $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Image gradient&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$x,y$축으로의 미세한 이산적인 차이를 이용해 derivative를 구했으므로, 이제 image의 gradient를 정의해볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지의 gradient는 다음과 같이 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \nabla f=\bigg[\dfrac{\partial f}{\partial x},\dfrac{\partial f}{\partial y}\bigg] $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQieJ4/btr8gwDYyWr/ExXlxQvcGHj5U1vc7l8Hp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQieJ4/btr8gwDYyWr/ExXlxQvcGHj5U1vc7l8Hp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQieJ4/btr8gwDYyWr/ExXlxQvcGHj5U1vc7l8Hp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQieJ4%2Fbtr8gwDYyWr%2FExXlxQvcGHj5U1vc7l8Hp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;865&quot; height=&quot;146&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradient는 해당 픽셀 위치에서, 가장 급격하게 intensity가 증가하는 방향을 가리키게 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 급격하게 변할수록 이렇게 intensity가 급격하게 변할수록 edge일 가능성이 크다고 말할 수 있으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;edge strength는 gradient의 magnitude와 같게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \|\nabla f\|=\sqrt{\bigg(\dfrac{\partial f}{\partial x}\bigg)^2+\bigg(\dfrac{\partial f}{\partial y}\bigg)^2} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, gradient의 direction은 다음과 같이 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \theta=\tan^{-1}\bigg(\dfrac{\partial f}{\partial y}\bigg/\dfrac{\partial f}{\partial x}\bigg)=\tan^{-1}\bigg(\dfrac{\partial x}{\partial y}\bigg) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W8EgD/btr76yQtMXN/aRp8tKqwvci0yo2MsWQpX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W8EgD/btr76yQtMXN/aRp8tKqwvci0yo2MsWQpX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W8EgD/btr76yQtMXN/aRp8tKqwvci0yo2MsWQpX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW8EgD%2Fbtr76yQtMXN%2FaRp8tKqwvci0yo2MsWQpX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;415&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Effects of noise&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 일반적으로 아래와 같은 그림처럼 noise 없이 깔끔하게 intensity가 변화하지는 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lsGQh/btr8eXBR5KF/3zXVMqeOsUHR0E38n3lBk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lsGQh/btr8eXBR5KF/3zXVMqeOsUHR0E38n3lBk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lsGQh/btr8eXBR5KF/3zXVMqeOsUHR0E38n3lBk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlsGQh%2Fbtr8eXBR5KF%2F3zXVMqeOsUHR0E38n3lBk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;314&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지란 본래 noise를 가지고 있기 마련이며, 그 결과는 보통 아래처럼 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coi5II/btr8f3aKtmU/hKMfjF8SzZoB9BYbYEpQRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coi5II/btr8f3aKtmU/hKMfjF8SzZoB9BYbYEpQRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coi5II/btr8f3aKtmU/hKMfjF8SzZoB9BYbYEpQRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcoi5II%2Fbtr8f3aKtmU%2FhKMfjF8SzZoB9BYbYEpQRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;355&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 noise가 있을 경우에는 미분을 해서 극값을 이용해 edge를 찾는 게 매우 challenging하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 noise문제를 어떻게 해결하면 좋을까?&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Solution: smooth first&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/13nkV/btr79fJFGpv/oAiiIfQpF3TjlxmkfFZLK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/13nkV/btr79fJFGpv/oAiiIfQpF3TjlxmkfFZLK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/13nkV/btr79fJFGpv/oAiiIfQpF3TjlxmkfFZLK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F13nkV%2Fbtr79fJFGpv%2FoAiiIfQpF3TjlxmkfFZLK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;425&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 우리는 gaussian filter에 대해서 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gaussian filter는 low-frequency는 통과시키며, high-frequency는 무시해버리는 low-pass filter라고 했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, noise가 있는 intensity function에 gaussian filter를 적용하면 세 번째 줄의 그래프처럼 상당히 smooth한 function을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후, 우리가 목표했던 방식으로 edge를 찾아나가면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, $\dfrac{d}{dx}(f*h)$ 의 극값을 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Associative property of convolution&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Discrete한 pixel에 대한 differentiation을 convolution 연산을 통해 해주었는데, convolution 연산은 associative 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \dfrac{d}{dx}(fh)=f\dfrac{d}{dx}h $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 성립한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어차피 같은 결과를 얻는다면, 연산량을 줄이는 것이 바람직하므로 오른쪽 $f*\dfrac{d}{dx}h$ 처럼 gaussian kernel을 먼저 미분해주고, 그 결과와 이미지를 convolution한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;The 1D Gaussian and its derivatives&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립변수가 하나인 gaussian distribution의 경우 미분의 결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dW6K6i/btr77OZ9wqh/CadPU0CzbD2vQ1aHGk5PLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dW6K6i/btr77OZ9wqh/CadPU0CzbD2vQ1aHGk5PLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dW6K6i/btr77OZ9wqh/CadPU0CzbD2vQ1aHGk5PLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdW6K6i%2Fbtr77OZ9wqh%2FCadPU0CzbD2vQ1aHGk5PLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;247&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2D edge detection filters&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리는 독립변수가 $x,y$ 두 개인 경우를 고려하므로, 각 변수(축)에 대해 각각 따로 미분을 고려해주어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, $x, y$축에 대한 2D gaussian distribution의 미분 결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1Uqhw/btr8iZTrwFc/YE0hcKE5iADtb4zy3YXWK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1Uqhw/btr8iZTrwFc/YE0hcKE5iADtb4zy3YXWK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1Uqhw/btr8iZTrwFc/YE0hcKE5iADtb4zy3YXWK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1Uqhw%2Fbtr8iZTrwFc%2FYE0hcKE5iADtb4zy3YXWK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;435&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;The Sobel operator&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림에서 $x,y$ direction에서의 미분 결과를 살펴보았는데, 이를 kernel로 나타내면, 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YBO5y/btr8H2bgVgg/gw3PZOmVKiKgws5ikYhrb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YBO5y/btr8H2bgVgg/gw3PZOmVKiKgws5ikYhrb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YBO5y/btr8H2bgVgg/gw3PZOmVKiKgws5ikYhrb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYBO5y%2Fbtr8H2bgVgg%2Fgw3PZOmVKiKgws5ikYhrb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;212&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림처럼, 정확한 gradient magnitude를 알고 싶다면, $\dfrac{1}{8}$ term을 넣어주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(하지만 그냥 gradient를 이용해서 edge를 detect하기 위함이면 없어도 된다.)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나 중요한 것은, 나도 헷갈렸던 건데, $x,y$ 축과 필터의 방향을 잘 맞춰야 한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 필터는 이미지를 아래의 축을 기준으로 생각한 결과이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biAbBt/btr8IKnDT1B/sIY0DYffkaFyvZ31VQRuM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biAbBt/btr8IKnDT1B/sIY0DYffkaFyvZ31VQRuM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biAbBt/btr8IKnDT1B/sIY0DYffkaFyvZ31VQRuM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiAbBt%2Fbtr8IKnDT1B%2FsIY0DYffkaFyvZ31VQRuM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;266&quot; height=&quot;232&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, numpy 행렬이나 이미지와 같이 좌측 상단이 원점인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DtEjc/btr8IxhOJ3v/qLRf4jKkcnIk6aQpuVGAn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DtEjc/btr8IxhOJ3v/qLRf4jKkcnIk6aQpuVGAn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DtEjc/btr8IxhOJ3v/qLRf4jKkcnIk6aQpuVGAn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDtEjc%2Fbtr8IxhOJ3v%2FqLRf4jKkcnIk6aQpuVGAn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;228&quot; height=&quot;196&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 경우를 생각해보면, x filter는 그대로이지만, y filter의 방향을 바꿔야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coshY6/btr8wRPNY4e/nSDYVXQTvlllCg2EMB2i70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coshY6/btr8wRPNY4e/nSDYVXQTvlllCg2EMB2i70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coshY6/btr8wRPNY4e/nSDYVXQTvlllCg2EMB2i70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoshY6%2Fbtr8wRPNY4e%2FnSDYVXQTvlllCg2EMB2i70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;245&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 위와 같은 filter 를 가져야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;b&gt;Convolution 연산을 적용할 것이라면 filter를 x, y축으로 반전시켜야 하지만, 실질적으로 이건 후에 180도 반대인 것과 똑같은 동작을 하므로 큰 의미를 가지지 못함. 따라서 상관 없다고 말할 수 있다.&lt;/b&gt;)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은, sobel operator를 적용한 예이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDM9B0/btr8xOFgLwq/qAtGrYH2rGEEQzewt3UzHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDM9B0/btr8xOFgLwq/qAtGrYH2rGEEQzewt3UzHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDM9B0/btr8xOFgLwq/qAtGrYH2rGEEQzewt3UzHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDM9B0%2Fbtr8xOFgLwq%2FqAtGrYH2rGEEQzewt3UzHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;400&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gaussian filter을 이용해서 noise를 줄여주는 것은 매우 바람직하지만, 그 결과로 edge가 좀 두껍게 detecting되는 문제가 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O5io7/btr8wQXDmIl/0KVEgkTy36qc2rMzB2004k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O5io7/btr8wQXDmIl/0KVEgkTy36qc2rMzB2004k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O5io7/btr8wQXDmIl/0KVEgkTy36qc2rMzB2004k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO5io7%2Fbtr8wQXDmIl%2F0KVEgkTy36qc2rMzB2004k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;374&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 얇은 edge에 관심이 있으므로 두꺼워진 이 edge를 다시 얇게 하는 작업이 필요하다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Non-maximum supression&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8kS6g/btr8IuS4aMa/Q4fFxSmUQlpoKhzIGj3qxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8kS6g/btr8IuS4aMa/Q4fFxSmUQlpoKhzIGj3qxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8kS6g/btr8IuS4aMa/Q4fFxSmUQlpoKhzIGj3qxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8kS6g%2Fbtr8IuS4aMa%2FQ4fFxSmUQlpoKhzIGj3qxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;363&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sobel operator로 얻은 $x,y$축에 대한 값을 arctan를 이용해 각 $\theta$를 구한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NJj40/btr8wPqUCmu/k4u3Un2EBqfq3rBWSj1Y11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NJj40/btr8wPqUCmu/k4u3Un2EBqfq3rBWSj1Y11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NJj40/btr8wPqUCmu/k4u3Un2EBqfq3rBWSj1Y11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNJj40%2Fbtr8wPqUCmu%2Fk4u3Un2EBqfq3rBWSj1Y11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;295&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\theta$를 이용해서, 해당 gradient의 방향(해당 방향과 반대방향 포함)으로 non maximum suppression을 진행해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기서 non maximum suppression이란, 해당 pixel이 gradient의 양방향에 있는 pixel보다 커야만 그대로 두고, 아닌 경우 0으로 아예 죽여(?)버리는 기법을 의미한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 해당 gradient 방향으로 가장 큰 값만 남기게 되므로, thin한 edge가 형성될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;u&gt;그런데 이 non maximum suppression의 구현 과정에서도, 매우 헷갈리는 상황이 발생하는데, 이후 구현 관련 포스팅에서 다뤄보도록 한다.&lt;/u&gt;)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, NMS를 보통은 [0, 45, 90, 135]의 네 방향에 대해서만 적용하는데, 따라서 해당 각도들이 아닌 각도들을 [0, 45, 90, 135]의 방향으로 interpolating해주는 작업이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, $\pm22.5$도만큼의 범위를 정해놓고 interpolating을 해주면 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 NMS를 적용하기 전과 후의 이미지이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8bBIR/btr8JkPPnn3/OEkJgFt2iT4yCZmBR7KOU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8bBIR/btr8JkPPnn3/OEkJgFt2iT4yCZmBR7KOU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8bBIR/btr8JkPPnn3/OEkJgFt2iT4yCZmBR7KOU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8bBIR%2Fbtr8JkPPnn3%2FOEkJgFt2iT4yCZmBR7KOU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;362&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Thresholding edges&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 최종적으로 edge를 detecting 하기 위해서, strong한 edge들만을 남겨놓고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 2개의 threshold를 사용하며, 큰 threshold $T$와 작은 threshold $t$ 를 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$R &amp;gt; T$ 인 경우 : strong edge&lt;/li&gt;
&lt;li&gt;$t &amp;lt; R &amp;lt; T$ 인 경우 : weak edge&lt;/li&gt;
&lt;li&gt;$R &amp;lt; t$ 인 경우 : no edge&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 분류된 pixel들은 다음과 같이 처리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Strong edge로 분류된 pixel : 그대로 남겨둔다.&lt;/li&gt;
&lt;li&gt;Weak edge로 분류된 pixel : strong edge와 연결되어 있다면(주위 8 pixel중 하나에) strong edge가 된다. (없으면 no edge)&lt;/li&gt;
&lt;li&gt;No edge : 그냥 edge 없는 경우.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGUNq/btr8J4ssyHW/bASWYCjFHPJv8et7eay3K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGUNq/btr8J4ssyHW/bASWYCjFHPJv8et7eay3K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGUNq/btr8J4ssyHW/bASWYCjFHPJv8et7eay3K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGUNq%2Fbtr8J4ssyHW%2FbASWYCjFHPJv8et7eay3K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;384&quot; height=&quot;386&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리해보면, canny edge detector는 다음과 같은 algorithm으로 구성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;1001&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X3jHO/btr8I2aQSI1/9K9XkFnzLmRcIrhkK4UZKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X3jHO/btr8I2aQSI1/9K9XkFnzLmRcIrhkK4UZKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X3jHO/btr8I2aQSI1/9K9XkFnzLmRcIrhkK4UZKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX3jHO%2Fbtr8I2aQSI1%2F9K9XkFnzLmRcIrhkK4UZKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;384&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;1001&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Canny edge detector는 여러 parameter로 조정을 할 수 있는데, 그 중 $\sigma$에 대해 다뤄보자면, $\sigma$는 gaussian blurring의 width를 조정한다고 할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;large $\sigma$ : &amp;ldquo;large-scale&amp;rdquo; edge를 detect함.&lt;/li&gt;
&lt;li&gt;small $\sigma$ : fine edge를 detect함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mIdAx/btr8BeDvE5f/Owda0mWQbKVMac9fGRi9o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mIdAx/btr8BeDvE5f/Owda0mWQbKVMac9fGRi9o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mIdAx/btr8BeDvE5f/Owda0mWQbKVMac9fGRi9o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmIdAx%2Fbtr8BeDvE5f%2FOwda0mWQbKVMac9fGRi9o0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;268&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Computer Vision</category>
      <category>Computer Vision</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/78</guid>
      <comments>https://faceyourfear.tistory.com/78#entry78comment</comments>
      <pubDate>Fri, 7 Apr 2023 16:09:11 +0900</pubDate>
    </item>
    <item>
      <title>Image filtering</title>
      <link>https://faceyourfear.tistory.com/77</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;What is Image?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A grid (matrix) of intensity values (보통 0이 black, 255 : white를 의미)&lt;/li&gt;
&lt;li&gt;이 map을 intensity(강도) map이라고도 함&lt;/li&gt;
&lt;li&gt;이 grid를 pixel이라고 함&lt;/li&gt;
&lt;li&gt;이 pixel 하나하나가 intensity value를 가지고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxqreP/btr74uyCx05/yAXpkXwl2kBASLAwLbK3sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxqreP/btr74uyCx05/yAXpkXwl2kBASLAwLbK3sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxqreP/btr74uyCx05/yAXpkXwl2kBASLAwLbK3sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxqreP%2Fbtr74uyCx05%2FyAXpkXwl2kBASLAwLbK3sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;264&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Images as functions&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지는 discrete한 pixel수를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pixel value&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;grayscale/intensity
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[0, 255]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;color
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RGB는 [R, G, B] 즉 빨강 초록 파랑의 3 채널이고, 각각 [0, 255] per channel&lt;/li&gt;
&lt;li&gt;HSV [H, S, V]: Hue, saturation, value 로 나타낼 수도 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Image는 $R^2$에서 $R$ 또는 $R^M$ 으로의 함수 $f$라고 생각할 수도 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Grayscale 이라면 :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$f(x,y)$는 각 위치 $(x,y)$의 intensity를 의미하며,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Color 이면 :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$f(x,y)=[r(x,y), g(x,y),b(x,y)]$ 의 $R^3$ 으로 매핑.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvoaRR/btr79gavajR/hrxzZqCaRKlKZiL81YIiz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvoaRR/btr79gavajR/hrxzZqCaRKlKZiL81YIiz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvoaRR/btr79gavajR/hrxzZqCaRKlKZiL81YIiz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvoaRR%2Fbtr79gavajR%2FhrxzZqCaRKlKZiL81YIiz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;306&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Image transformations&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수와 마찬가지로, 이미지에도 어떠한 operator를 적용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dokghJ/btr8gU5ydsZ/8QcXsasyXmtidilBrxmzrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dokghJ/btr8gU5ydsZ/8QcXsasyXmtidilBrxmzrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dokghJ/btr8gU5ydsZ/8QcXsasyXmtidilBrxmzrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdokghJ%2Fbtr8gU5ydsZ%2F8QcXsasyXmtidilBrxmzrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;211&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중에서도 특별한 연산이 있는데, 합성곱 즉 convolution에 대해서 다뤄본다. (linear filtering)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Image denoising&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VtGob/btr77hHxhjb/Dh8olT2c5abEItmc02J48K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VtGob/btr77hHxhjb/Dh8olT2c5abEItmc02J48K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VtGob/btr77hHxhjb/Dh8olT2c5abEItmc02J48K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVtGob%2Fbtr77hHxhjb%2FDh8olT2c5abEItmc02J48K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;279&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 images에서 noise가 나타나는 이유는 무엇인가?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sensor noise&lt;/li&gt;
&lt;li&gt;Dead pixels&lt;/li&gt;
&lt;li&gt;Old photographs&lt;/li&gt;
&lt;li&gt;etc.,&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Noise reduction은 어떻게 할 수 있을까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;근처의 pixel은 같은 object일 것이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;따라서 비슷한 색깔을 가질 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 픽셀을 주변 픽셀의 평균으로 대체한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Mean filtering&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UzFCq/btr8gWWAjhg/WhLWrZgmJh6pGoKsc6Bs80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UzFCq/btr8gWWAjhg/WhLWrZgmJh6pGoKsc6Bs80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UzFCq/btr8gWWAjhg/WhLWrZgmJh6pGoKsc6Bs80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUzFCq%2Fbtr8gWWAjhg%2FWhLWrZgmJh6pGoKsc6Bs80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;359&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 정수를 쓸 것이므로 7이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kernel의 사이즈가 5가 되면?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byrmaR/btr75t2MN0N/KzMa34NKFKWcUNHmHRmX7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byrmaR/btr75t2MN0N/KzMa34NKFKWcUNHmHRmX7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byrmaR/btr75t2MN0N/KzMa34NKFKWcUNHmHRmX7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyrmaR%2Fbtr75t2MN0N%2FKzMa34NKFKWcUNHmHRmX7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;358&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 7이다. (반올림)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Noise reduction using mean filtering&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OMYtC/btr8gUYKBiM/mTruycoHQKHXOM3nqILbKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OMYtC/btr8gUYKBiM/mTruycoHQKHXOM3nqILbKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OMYtC/btr8gUYKBiM/mTruycoHQKHXOM3nqILbKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOMYtC%2Fbtr8gUYKBiM%2FmTruycoHQKHXOM3nqILbKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;476&quot; height=&quot;229&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 부드러워지긴 했으나, 선명도가 떨어졌다. (sharpness)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Filters&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Filtering
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 픽셀들이 원래 이미지의 픽셀들의 linear combination이 되는 새로운 이미지를 생성하는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Why?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좀 더 유용한 information을 얻기 위해
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;edge나 contour같은 특징을 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;image를 enhance하기 위해
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;noise를 감소시키기 위해 blur 처리&lt;/li&gt;
&lt;li&gt;sharpen하기 위해&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CNN의 key 연산자이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Linear filtering&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 simple한 filtering의 종류: linear filtering (cross-correlation, convolution)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 픽셀을 neighbor들의 linear combination으로 대체한다. (weighted sum)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 틀을 &amp;ldquo;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;kernel&lt;/b&gt;&lt;/span&gt;&amp;rdquo; 혹은 mask 또는 filter라고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deVyjU/btr8ibsalHY/DKI7OSyzd7i4ERp55pUmqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deVyjU/btr8ibsalHY/DKI7OSyzd7i4ERp55pUmqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deVyjU/btr8ibsalHY/DKI7OSyzd7i4ERp55pUmqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeVyjU%2Fbtr8ibsalHY%2FDKI7OSyzd7i4ERp55pUmqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;184&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;($10\times0+5\times0+3\times0+4\times0+6\times0.5+1\times0+1\times0+1\times1+8\times0.5=8$)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 mean filtering은 linear filtering의 일종이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Wv4w/btr74421s5C/kPeRKgNr62Wuoh00kwcIIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Wv4w/btr74421s5C/kPeRKgNr62Wuoh00kwcIIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Wv4w/btr74421s5C/kPeRKgNr62Wuoh00kwcIIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Wv4w%2Fbtr74421s5C%2FkPeRKgNr62Wuoh00kwcIIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;246&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S&lt;a href=&quot;m,n&quot;&gt;f&lt;/a&gt;=\sum_{i=-1}^1\sum_{j=-1}^1\dfrac{f(m+i,n+j)}{9} $$&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 일반적인 linear filtering의 경우는 weight가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S&lt;a href=&quot;m,n&quot;&gt;f&lt;/a&gt;=\sum_{i=-1}^1\sum_{j=-1}^1w(i,j)f(m+i,n+j) $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 되고, 이 때 $w(i,j)$가 kernel 또는 filter matrix의 각 원소가 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 kernel size가 달라질 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 kernel size도 general하게 고려해주면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S&lt;a href=&quot;m,n&quot;&gt;f&lt;/a&gt;=\sum_{i=-k}^k\sum_{j=-k}^kw(i,j)f(m+i,n+j) $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 된다. (kernel size는 $2k+1$)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Convolution and cross-correlation&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Cross correlation&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S[f]=w\otimes f $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S&lt;a href=&quot;m,n&quot;&gt;f&lt;/a&gt;=\sum_{i=-k}^k\sum_{j=-k}^kw(i,j)f(m+i,n+j) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpZzYS/btr75sW40kW/ykKLUGqXFK5GwI68nHeoKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpZzYS/btr75sW40kW/ykKLUGqXFK5GwI68nHeoKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpZzYS/btr75sW40kW/ykKLUGqXFK5GwI68nHeoKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpZzYS%2Fbtr75sW40kW%2FykKLUGqXFK5GwI68nHeoKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;267&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(즉 같은 자리에 대응하도록 곱해주고 더해주면 됨)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Convolution&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S[f]=w*f $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S&lt;a href=&quot;m,n&quot;&gt;f&lt;/a&gt;=\sum_{i=-k}^k\sum_{j=-k}^kw(i,j)f(m-i,n-j) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crzyWm/btr8eV4XXBQ/spK1gAOxA4MlkCAttMkyL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crzyWm/btr8eV4XXBQ/spK1gAOxA4MlkCAttMkyL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crzyWm/btr8eV4XXBQ/spK1gAOxA4MlkCAttMkyL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrzyWm%2Fbtr8eV4XXBQ%2FspK1gAOxA4MlkCAttMkyL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;256&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;(행으로, 열로 커널을 각각 뒤집어서 cross-correlation을 하면 더 쉽다.)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BZMZP/btr8gXgTBH7/uD2CjHmeCYJ4hMEx30ri3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BZMZP/btr8gXgTBH7/uD2CjHmeCYJ4hMEx30ri3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BZMZP/btr8gXgTBH7/uD2CjHmeCYJ4hMEx30ri3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBZMZP%2Fbtr8gXgTBH7%2FuD2CjHmeCYJ4hMEx30ri3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;227&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cross-correlation과 convolution은 linearity를 만족한다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 중요한 property로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Shift invariance&lt;/b&gt;&lt;/span&gt;가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shift가 일어나도 연산의 효과는 다르지 않음을 의미!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 shift하고 convolution을 하던지, convolution을 하고 shift를 하던 상관이 없음&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Sharpening&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnJLZu/btr8ibFG1Od/KCisASXBzqVjKPtcSecZf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnJLZu/btr8ibFG1Od/KCisASXBzqVjKPtcSecZf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnJLZu/btr8ibFG1Od/KCisASXBzqVjKPtcSecZf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnJLZu%2Fbtr8ibFG1Od%2FKCisASXBzqVjKPtcSecZf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;347&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co0oTJ/btr74421Rxw/NWKWzj5kRuumCKwYUijv41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co0oTJ/btr74421Rxw/NWKWzj5kRuumCKwYUijv41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co0oTJ/btr74421Rxw/NWKWzj5kRuumCKwYUijv41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco0oTJ%2Fbtr74421Rxw%2FNWKWzj5kRuumCKwYUijv41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;391&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sharpening을 수식으로 나타내면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*}f_{sharp}&amp;amp;=f+\alpha(f-f_{blur})\\&amp;amp;=(1+\alpha)f-\alpha f_{blur}\\&amp;amp;=(1+\alpha)(wf)-\alpha(vf)\\&amp;amp;=((1+\alpha)w-\alpha v)f\end{align} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 $f$는 원래 이미지를 의미하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$w,v$는 각각 다음과 같은 filter를 의미한다. (좌측부터 순서대로)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG1tgo/btr77hU4QGZ/Sa8KwH4GprY4jb3uOlRBqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG1tgo/btr77hU4QGZ/Sa8KwH4GprY4jb3uOlRBqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG1tgo/btr77hU4QGZ/Sa8KwH4GprY4jb3uOlRBqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG1tgo%2Fbtr77hU4QGZ%2FSa8KwH4GprY4jb3uOlRBqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;423&quot; height=&quot;156&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 만약 &lt;span&gt;\alpha=1&lt;/span&gt; 일 때, sharpening filter는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGyG2O/btr8hxWyGrD/VsuteEbw5JjiM3ekqSloo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGyG2O/btr8hxWyGrD/VsuteEbw5JjiM3ekqSloo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGyG2O/btr8hxWyGrD/VsuteEbw5JjiM3ekqSloo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGyG2O%2Fbtr8hxWyGrD%2FVsuteEbw5JjiM3ekqSloo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;208&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Gaussian filter&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mean filter와 달리, &lt;b&gt;nearby pixel은 far-away pixel보다 더 correlated 할 것이라는 가정&lt;/b&gt;을 내포하는 filter이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, nearby pixel에 더 weight를 많이 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bakMYF/btr77PKOG9z/PKaxNgRniK2p8beTAG8G5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bakMYF/btr77PKOG9z/PKaxNgRniK2p8beTAG8G5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bakMYF/btr77PKOG9z/PKaxNgRniK2p8beTAG8G5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbakMYF%2Fbtr77PKOG9z%2FPKaxNgRniK2p8beTAG8G5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;269&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림은 독립변수가 1개, 2개일 경우의 gaussian distribution을 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, &lt;b&gt;kernel은 이산적인 값을 가지기 때문에, 위의 continuous한 값을 가질 수 없다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 이에 근사한 값을 가지도록 kernel을 구성해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IU7Ds/btr79eDNAy3/OOGAYKkUvvyMVXDjvCvCCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IU7Ds/btr79eDNAy3/OOGAYKkUvvyMVXDjvCvCCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IU7Ds/btr79eDNAy3/OOGAYKkUvvyMVXDjvCvCCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIU7Ds%2Fbtr79eDNAy3%2FOOGAYKkUvvyMVXDjvCvCCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;259&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이처럼 kernel을 구성할 때, gaussian distribution의 앞 계수(factor)는 신경쓰지 않고 kernel의 모든 원소의 합이 1이 되도록 normalize만 해주면 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 gaussian filter를 이미지에 적용한 모습이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ3ByM/btr75uglEU6/QkXny4Dz2Hqsp8Dm54lIfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ3ByM/btr75uglEU6/QkXny4Dz2Hqsp8Dm54lIfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ3ByM/btr75uglEU6/QkXny4Dz2Hqsp8Dm54lIfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ3ByM%2Fbtr75uglEU6%2FQkXny4Dz2Hqsp8Dm54lIfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;403&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우시안 필터는 &amp;ldquo;&lt;b&gt;high-frequency&lt;/b&gt;&amp;rdquo; components를 제거하는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;low-pass filter&lt;/b&gt;&lt;/span&gt; 라고도 할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, gaussian filter끼리의 convolution의 결과도 gaussian이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pgUdV/btr76Am3HQ9/9l24Xbm1QhJeEtCZygbrSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pgUdV/btr76Am3HQ9/9l24Xbm1QhJeEtCZygbrSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pgUdV/btr76Am3HQ9/9l24Xbm1QhJeEtCZygbrSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpgUdV%2Fbtr76Am3HQ9%2F9l24Xbm1QhJeEtCZygbrSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;162&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(즉, $\sigma$의 gaussian kernel을 두 번 적용하는 것은 $\sigma\sqrt2$의 kernel을 한 번 적용하는 것과 결과가 같다.)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Non-linear filters&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Thresholding&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQR1Xa/btr76zuZkKQ/ZpoJkZnbVVSV96L4JBNe5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQR1Xa/btr76zuZkKQ/ZpoJkZnbVVSV96L4JBNe5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQR1Xa/btr76zuZkKQ/ZpoJkZnbVVSV96L4JBNe5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQR1Xa%2Fbtr76zuZkKQ%2FZpoJkZnbVVSV96L4JBNe5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;554&quot; height=&quot;238&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thresholding은 필요한 임계값을 임의로 정하여 이미지를 처리하는 것으로, 이미지의 전, 후처리에서 중요한 filter중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ g(m,n)=\begin{cases}&amp;amp;255, \quad &amp;amp;f(m,n)&amp;gt;A\\&amp;amp;0&amp;amp;otherwise\end{cases} $$&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Rectification&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ g(m,n)=\max(f(m,n),0) $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rectification은 convolutional network의 중요한 component중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(특히 ReLU)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Median filter&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mean은 outlier에 굉장히 민감하게 반응한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzJwr/btr8huZPPUn/2fZ6MivJ5QHo7n2SkjNVak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzJwr/btr8huZPPUn/2fZ6MivJ5QHo7n2SkjNVak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzJwr/btr8huZPPUn/2fZ6MivJ5QHo7n2SkjNVak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmzJwr%2Fbtr8huZPPUn%2F2fZ6MivJ5QHo7n2SkjNVak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;296&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, mean filtering이 잘 적용이 되지 않는다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, median(중간값)을 택하여 해당 pixel에 replace해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 speckle noise를 이와 같은 방법으로 처리할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VpP9/btr79gn6AyH/yVe9a5kaq4PNk8skVAnQpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VpP9/btr79gn6AyH/yVe9a5kaq4PNk8skVAnQpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VpP9/btr79gn6AyH/yVe9a5kaq4PNk8skVAnQpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VpP9%2Fbtr79gn6AyH%2FyVe9a5kaq4PNk8skVAnQpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;300&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Vision</category>
      <category>Computer Vision</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/77</guid>
      <comments>https://faceyourfear.tistory.com/77#entry77comment</comments>
      <pubDate>Wed, 5 Apr 2023 15:36:49 +0900</pubDate>
    </item>
    <item>
      <title>티스토리(tistory) 모바일에서 LaTex 수식 깨짐 해결</title>
      <link>https://faceyourfear.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;수학 공부한 내용을 정리하거나, 논문 리뷰할 때 수식이 많이 나와 LaTex을 이용해서 블로그에 정리를 하곤 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 pc버전은 아무 문제가 없는데, 모바일 버전에서는 아래와 같이 내가 쓴 LaTex수식이 변환이 안되고 그대로 나와서 문제를 해결해보고자 했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJzC1/btr5OQ0hLGb/TZ0HHJNoF9tUZVe1Wiioi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJzC1/btr5OQ0hLGb/TZ0HHJNoF9tUZVe1Wiioi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJzC1/btr5OQ0hLGb/TZ0HHJNoF9tUZVe1Wiioi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJzC1%2Fbtr5OQ0hLGb%2FTZ0HHJNoF9tUZVe1Wiioi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;470&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 여러 블로그를 참고해보니 아래와 같은 솔루션을 제공했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5FTTR/btr5OQTvRQD/QYAefYbkc7UHY3UXryZGR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5FTTR/btr5OQTvRQD/QYAefYbkc7UHY3UXryZGR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5FTTR/btr5OQTvRQD/QYAefYbkc7UHY3UXryZGR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5FTTR%2Fbtr5OQTvRQD%2FQYAefYbkc7UHY3UXryZGR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;387&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 서식 관리에 들어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXgMZ/btr5UkrXRjD/YctnXC12zbDAW9lkPC2sRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXgMZ/btr5UkrXRjD/YctnXC12zbDAW9lkPC2sRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXgMZ/btr5UkrXRjD/YctnXC12zbDAW9lkPC2sRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXgMZ%2Fbtr5UkrXRjD%2FYctnXC12zbDAW9lkPC2sRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;190&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서식 쓰기 누르고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목은 대충 아무거나 짓고,&lt;/p&gt;
&lt;pre id=&quot;code_1679797991592&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p data-ke-size=&quot;size16&quot;&amp;gt;
    &amp;lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 넣으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV7scp/btr5UkerlUw/IoSXeyOYpTUjjN2LNVGmQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV7scp/btr5UkerlUw/IoSXeyOYpTUjjN2LNVGmQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV7scp/btr5UkerlUw/IoSXeyOYpTUjjN2LNVGmQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV7scp%2Fbtr5UkerlUw%2FIoSXeyOYpTUjjN2LNVGmQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;308&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 완료를 누르게 되면, 아래처럼 서식이 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCgjY/btr5Qh3677Q/yykiBNnK9q3bf7I3pnAXGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCgjY/btr5Qh3677Q/yykiBNnK9q3bf7I3pnAXGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCgjY/btr5Qh3677Q/yykiBNnK9q3bf7I3pnAXGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCgjY%2Fbtr5Qh3677Q%2FyykiBNnK9q3bf7I3pnAXGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;551&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제&amp;nbsp; 변환을 원하는 페이지마다 들어가서 수정을 누르고,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bplaZV/btr5Q44dXzx/LczOFx2siTHfNqTIJtkShk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bplaZV/btr5Q44dXzx/LczOFx2siTHfNqTIJtkShk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bplaZV/btr5Q44dXzx/LczOFx2siTHfNqTIJtkShk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbplaZV%2Fbtr5Q44dXzx%2FLczOFx2siTHfNqTIJtkShk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;235&quot; height=&quot;433&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서식에 들어가서 작성한 서식을 눌러주면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjI7et/btr5Q4JTEYl/lRjqqTDZXLU84sExxeid6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjI7et/btr5Q4JTEYl/lRjqqTDZXLU84sExxeid6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjI7et/btr5Q4JTEYl/lRjqqTDZXLU84sExxeid6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjI7et%2Fbtr5Q4JTEYl%2FlRjqqTDZXLU84sExxeid6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;584&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 상단에 script가 두 개 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 수정을 완료하면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 여기서!! 모바일에서 다 업데이트가 될 수도 있고, 안 될 수도 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 같은 경우에는 아래처럼 inline Latex이 적용이 안됐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2ZlA8/btr5QyLjBce/CY3mnJDyBlDxkN5t5aKfCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2ZlA8/btr5QyLjBce/CY3mnJDyBlDxkN5t5aKfCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2ZlA8/btr5QyLjBce/CY3mnJDyBlDxkN5t5aKfCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2ZlA8%2Fbtr5QyLjBce%2FCY3mnJDyBlDxkN5t5aKfCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1135&quot; height=&quot;516&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자의 경우 script에서 한 줄을 더 넣어 아래와 같은 script를 서식에다 만들어주니&lt;/p&gt;
&lt;pre id=&quot;code_1679798381229&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p data-ke-size=&quot;size16&quot;&amp;gt;
    &amp;lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 깔끔하게 변환이 되었다..!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rw8HV/btr5PQMdhZF/KQPMfGLV6D4Xf7mDDFAUjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rw8HV/btr5PQMdhZF/KQPMfGLV6D4Xf7mDDFAUjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rw8HV/btr5PQMdhZF/KQPMfGLV6D4Xf7mDDFAUjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frw8HV%2Fbtr5PQMdhZF%2FKQPMfGLV6D4Xf7mDDFAUjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;449&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 블로그에도 이런 방법을 알려주는 곳은 없었는데.. 내 티스토리 셋팅이 이상한 건가 싶기도 했다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 무사히 해결해서 다행.&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <category>latex</category>
      <category>삽질</category>
      <category>티스토리</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/76</guid>
      <comments>https://faceyourfear.tistory.com/76#entry76comment</comments>
      <pubDate>Sun, 26 Mar 2023 11:42:38 +0900</pubDate>
    </item>
    <item>
      <title>CH04. Stereo Systems (2)</title>
      <link>https://faceyourfear.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Perspective structure from motion&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서서는 간단한 affine한 경우를 알아봤고, 이제는 좀 더 일반적인 projective cameras 에 대해 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Projective cameras $M_i$는 11의 자유도를 가지고, up to scale로 다음과 같이 표현 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ M_i=\begin{bmatrix}a_{11}&amp;amp;a_{12}&amp;amp;a_{13}&amp;amp;b_1\\a_{21}&amp;amp;a_{22}&amp;amp;a_{23}&amp;amp;b_2\\a_{31}&amp;amp;a_{32}&amp;amp;a_{33}&amp;amp;1\end{bmatrix} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Affine 의 경우에는 affine transformation을 structure 행렬, motion에 해줬던 것처럼,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에는 projective transformation을 struture, motion 행렬에 적용해줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(motion matrix에는 $4\times4$ projective transformation $H$를, structure에는 $H^{-1}$를)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 해도 결과적으로 image plane에서의 observations은 달라지지 않는다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Affine의 경우와 마찬가지로 $m$개의 motion matrix $M_i$와 $n$개의 3D 점 $X_i$를 이용해 $mn$개의 observation $x_{ij}$를 잡을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라와 점들은 up to scale로 $4\times4$ projective transformation으로 변환될 수 있으므로, $2mn$개의 equation과 $11m+3n-15$의 미지수를 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이를 이용해서 필요한 view와 observation의 개수를 결정할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;The algebraic approach&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bop8qi/btr1UU5PQhb/oTpXLkrCrdvZNVKbsTtMhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bop8qi/btr1UU5PQhb/oTpXLkrCrdvZNVKbsTtMhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bop8qi/btr1UU5PQhb/oTpXLkrCrdvZNVKbsTtMhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbop8qi%2Fbtr1UU5PQhb%2FoTpXLkrCrdvZNVKbsTtMhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;428&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 카메라에 대한 SFM을 구하기 위해 fundamental matrix $F$를 이용한 대수적 접근(algebraic approach)을 한번 다뤄보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 대수적 접근법의 주 아이디어는 perspective transformation $H$가 적용된 카메라 행렬 $M_1, M_2$를 계산해내는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 카메라 행렬 $M_i$가 $H$가 적용된 행렬만 계산해낼 수 있기 때문에, 첫번째 카메라 projection matrix $M_1H^{-1}$을 canonical하다고 잡을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 두 번째 카메라에도 다음과 같이 똑같은 transformation이 적용돼야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ M_1H^{-1}=\begin{bmatrix}I&amp;amp;0\end{bmatrix}\quad\quad M_2H^{-1}=\begin{bmatrix}A&amp;amp;b\end{bmatrix} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이 문제를 해결하기 위해서는 eight point algorithm을 이용해서 fundamental matrix $F$를 구해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후, $F$를 이용해 $M_1,M_2$를 추정해낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 대응하는 observations $p,p^\prime$에 해당하는 3D 점 $P$를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 두 camera projection matrix에 똑같이 $H^{-1}$을 적용했기 때문에, structure에는 $H$를 적용해줘야 한다. ( $\tilde{P}=HP$ )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, pixel 좌표 $p,p^\prime$은 다음과 같이 변환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ p=M_1P=M_1H^{-1}HP=\begin{bmatrix}I&amp;amp;0\end{bmatrix}\tilde{P}\\p^\prime=M_2P=M_2H^{-1}HP=\begin{bmatrix}A&amp;amp;b\end{bmatrix}\tilde{P} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 $p$와 $p^\prime$으로부터 다음과 같은 식을 유도할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*}p^\prime&amp;amp;=[A|b]\tilde{P}\\&amp;amp;=A[I|0]\tilde{P}+b\\&amp;amp;=Ap+b\end{align*} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양변에 $b$를 cross product 해주면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ p^\prime\times b=(Ap+b)\times b=Ap\times b $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과 같고, cross product의 정의에 따라, $p^\prime\times b$는 $p^\prime$과 perpendicular하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*}0&amp;amp;=p^{\prime T}(p^\prime\times b)\\&amp;amp;=p^{\prime T}(Ap\times b)\\&amp;amp;=p^{\prime T}(b\times Ap)\\&amp;amp;=p^{\prime T}[b]_\times Ap\end{align*} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 성립한다. 그런데 마지막 식의 꼴을 보면 fundamental matrix의 정의인 $p^{\prime T}Fp=0$가 떠오를 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 $F=[b]_\times A$ 라고 잡으면, $A$와 $b$를 구하는 문제가 그냥 decomposition이 되는 것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 먼저 $b$를 결정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cross product의 정의에 따라, $Fb$를 다음과 같이 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ Fb=[b]_\times Ab=(b\times A)b=0 $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$F$는 singular하기 때문에(rank가 2임), $b$ 는 SVD를 이용해 $\|b\|=1$일 때 $Fb=0$의 least square solution을 구하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 $A$를 구해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$A^\prime=-[b]_\times F$로 잡으면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*}[b_\times]A^\prime&amp;amp;=-[b_\times][b_\times]F\\&amp;amp;=-(bb^T-|b|^2I)F\\&amp;amp;=-bb^TF+|b|^2F\\&amp;amp;=0+1\cdot F\\&amp;amp;=F\end{align*} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이므로 따라서 $A=A^\prime=-[b]_\times F$ 가 성립한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 카메라 행렬 $M_1H^{-1}$과 $M_2H^{-1}$에 대해 다음과 같은 식이 성립한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \tilde{M_1}=\begin{bmatrix}I&amp;amp;0\end{bmatrix}\quad\quad\tilde{M_2}=\begin{bmatrix}-[b_\times]F&amp;amp;b\end{bmatrix} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 식만 유도해내는 게 아니라, $b$를 기하학적으로 해석해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$b$는 $Fb=0$을 만족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Epipole 또한 $Fe_2=0$ 과 $F^Te_1=0$ 과 같은 식을 만족했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 $b$는 epipole 임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 camera projection camera의 식을 변형할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \tilde{M_1}=\begin{bmatrix}I&amp;amp;0\end{bmatrix}\quad\quad\tilde{M_2}=\begin{bmatrix}-[e_\times]F&amp;amp;e\end{bmatrix} $$&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Determining motion from the Essential matrix&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대수적 접근으로 reconstruction이 좀 더 잘되게 하려면 calibrate된 카메라를 사용하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서서 우리는 calibrate된 카메라의 경우 essential matrix를 썼었다.(fundamental의 특별한 경우, 즉 normalized coordinates)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 다음과 같은 식도 우리는 알고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ E=K^TFK $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Essential matrix의 경우는 calibrated camera의 경우이므로, 5의 자유도 즉 extrinsic parameter의 정보만을 encode하고 있다. (회전과 이동)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공교롭게도, 이 $R,t$가 딱 우리가 motion matrix를 찾아내기 위해 필요한 것들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 essential matrix $E$가 다음과 같이 표현되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ E=[t]_\times R $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 $E$를 두 개의 component로 분해해볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, cross product 행렬인 $[t]_\times$가 skew-symmetric하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 여기서 분해에 사옹할 두 개의 행렬을 먼저 정의해보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ W=\begin{bmatrix}0&amp;amp;-1&amp;amp;0\\1&amp;amp;0&amp;amp;0\\0&amp;amp;0&amp;amp;1\end{bmatrix},\quad\quad Z=\begin{bmatrix}0&amp;amp;1&amp;amp;0\\-1&amp;amp;0&amp;amp;0\\0&amp;amp;0&amp;amp;0\end{bmatrix} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여기서 나중에 사용할 중요한 성질은, $Z=\text{diag}(1,1,0)W$ 이 up to a sign 으로 만족하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ZW=ZW^T=\text{diag}(1,1,0)$ 이 up to a sign으로 만족한다.)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eigenvalue decomposition을 하면 up to scale로 다음과 같이 분해를 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ [t]_\times=UZU^T $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;($U$는 orthogonal matrix임)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 이 분해를 다음과 같이 바꿔 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ E=U\text{diag}(1,1,0)(WU^TR) $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세히 보면, SVD꼴인 $E=U\Sigma V^T$와 닮았다. (두 개의 singular value인 것도 비슷함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 $E$를 factorization할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ [t]_\times=UZU^T,\quad\quad R=UWV^T\,\text{or}\,\,\,UW^TV^T $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(위와 같은 factorization만이 가능함이 가능하고 타당함을 증명할 수 있지만 생략)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 $E$의 factorization은 행렬 $UWV^T$와 $UW^TV^T$가 orthogonal할 때만 보장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 $R$ 행렬이 타당한 회전행렬임을 확인하기 위해선, $R$의 determinant가 양수임을 보이기만 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ R=(\det{UWV^T})UWV^T\,\text{or}\,\,\,(\det{UW^TV^T})UW^TV^T $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회전 행렬 $R$과 마찬가지로, 평행이동 벡터 $t$도 여러 개가 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cross product의 정의에 따라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ t\times t=[t]_\times t=UZU^Tt=0 $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이며, $U$는 unitary하므로 $\|[t]_\times\|_F=\sqrt{2}$ 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, $E$는 up to scale인 것과 위의 방정식으로부터 이 factorization에서 $t$의 추정치는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ t=\pm U\begin{bmatrix}0\\0\\1\end{bmatrix}=\pm u_3 $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;($u_3$는 $U$의 마지막 column)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뿐만 아니라 $[t]_\times=UZU^T$를 이용해도 똑같은 결과를 얻을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh6QDz/btr1Vddwrer/Dtd9RvEXWAmUA28MXTWy61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh6QDz/btr1Vddwrer/Dtd9RvEXWAmUA28MXTWy61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh6QDz/btr1Vddwrer/Dtd9RvEXWAmUA28MXTWy61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh6QDz%2Fbtr1Vddwrer%2FDtd9RvEXWAmUA28MXTWy61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;445&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림처럼 4가지 가능한 $R,t$쌍이 있다. ($R,t$각각 2개의 경우의 수가 있으므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 이상적인 조건 하에서, 단 하나의 점만 있으면 정확한 $R,t$쌍을 찾을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올바른 $R,t$ 쌍에서, triangulated point $\hat{P}$는 두 카메라의 앞에 있어야 하고, 이는 이 점이 두 카메라 좌표계에서 $z$축으로 양의 값을 가짐을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Measurement noise로 인해 보통 하나의 점에 의존하지는 않고, 여러 점으로 triangulate를 진행하여 대부분의 점들이 카메라들의 앞쪽에 있도록 하는 올바른 $R,t$ 쌍을 찾는다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;An example structure from motion pipeline&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Motion 행렬 $M_i$를 찾고 나면, 이걸 이용해서 월드 좌표계의 점 $X_j$를 결정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대수적 접근의 경우, 그런 점들의 추정치는 perspective transformation $H$에 upto scale하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Essential matrix로부터 카메라 행렬을 추출해낼 때, 이 추저이는 up to scale하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 경우 모두 3D 점들은 앞에서 다뤘던 triangulatio method를 이용해 추정된 카메라 행렬에 의해 계산된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi-view로의 확장은 여러 카메라를 연결하여 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 카메라의 pair이던간에 충분한 대응점이 있다면, 앞서 다뤘던 대수적 접근법이나 essential matrix를 이용해 계산해낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 reconstructed된 3D 점들은 카메라 쌍에서 사용가능한 포인트 대응에 연관이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 pairwise solutions들은 bundle adjustment라는 기법을 통해 최적화될 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Bundle adjustment&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 방법들의 경우 한계점이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Factorization의 경우 모든 점들이 모든 image에서 보인다는 가정을 했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는 대응점을 찾기가 어렵거나 안 보일 때가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 대수적 접근이 카메라들을 연결하여 결합한 solution을 만들수는 있지만, 모든 카메라와 3D 점들을 사용한 일관되고 최적화된 reconstruction은 풀 수가 없다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제점을 해결하기 위해 nonlinear method인 bundle adjustment를 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적화에서는, estimated된 카메라로의 reconstructed point의 projection과 대응하는 observation사이의 pixel 거리인 reprojection error를 줄이는 것이 목표이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 triangulation에서 다뤘던 nonlinear optimization에서는 두 개의 카메라의 경우를 가정했었고, 또 모든 대응점이 각 카메라에서 보인다고 가정했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bundle adjustment는 여러 개의 camera를 다루지만, 각 카메라에서 보이는 observation에 대해서만 reprojection error를 계산하므로, 앞서 배운 triangulation에서의 nonlinear method와 상당히 유사하다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 bundle adjustment를 풀기위한 대표적인 방법으로 Gauss-Newton 알고리즘과 Levenberg-Marquardt 알고리즘이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bundle adjustment는 많은 수의 view에 대해서도 쉽게 처리를 할 수 있고, 모든 이미지에서 관찰되지 않은(일부 이미지에서만 해당 점이 관찰됨) 경우일지라도 처리를 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 view의 수가 많아질수록 파라미터의 수가 늘어나고, nonlinear optimization technique에 의존하므로 초기 조건이 매우 중요할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, bundle adjustment는 보통 SFM의 마지막 단계에서 구현이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, factorization이나 algebraic approach를 이용해 합리적인 초기해를 구해 놓고, bundle adjustment를 진행하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 factorization과 nonlinear method와 구현코드가 궁금하다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ianpark318/CS231A/blob/main/ps2/ps2_code/PSET2.ipynb&quot;&gt;https://github.com/ianpark318/CS231A/blob/main/ps2/ps2_code/PSET2.ipynb&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;참고&lt;/p&gt;</description>
      <category>3D\Multiview Geometry/CS231A</category>
      <category>3d</category>
      <category>CS231A</category>
      <author>재바기</author>
      <guid isPermaLink="true">https://faceyourfear.tistory.com/74</guid>
      <comments>https://faceyourfear.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 5 Mar 2023 17:19:38 +0900</pubDate>
    </item>
  </channel>
</rss>