<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://10snow.com</id>
    <title>Village • Posts by &#34;devlog&#34; category</title>
    <link href="https://10snow.com" />
    <updated>2023-12-30T16:00:00.000Z</updated>
    <category term="DevLog" />
    <category term="Gauss" />
    <category term="SiteLog" />
    <category term="HexoThemes" />
    <category term="Hexo" />
    <entry>
        <id>https://10snow.com/2023/12/30/2023end/</id>
        <title>博客优化与压缩软件</title>
        <link rel="alternate" href="https://10snow.com/2023/12/30/2023end/"/>
        <content type="html">&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;近况&#34;&gt;&lt;a href=&#34;#近况&#34; class=&#34;headerlink&#34; title=&#34;近况&#34;&gt;&lt;/a&gt;近况&lt;/h2&gt;&lt;p&gt;很久没更新博客了，我觉得回来水一篇，大家也不用担心我会跑路啦，博客域名已续了10年，别问钱哪里来的，问就是免费报销的啦~&lt;/p&gt;
&lt;p&gt;说回来，很久没写文了并不是别的原因，就是因为没有收入没什么回报，仅仅为了写文章也没什么动力，如果为了赚流量的话为什么不去恰烂钱呢？所以与其这样，不如躺平了算了。不过最近在写项目，顺便空闲时间给博客直接改造升级一波，然后顺手也写了篇博文总结一下最近的情况&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;对于整个站点的优化&#34;&gt;&lt;a href=&#34;#对于整个站点的优化&#34; class=&#34;headerlink&#34; title=&#34;对于整个站点的优化&#34;&gt;&lt;/a&gt;对于整个站点的优化&lt;/h2&gt;&lt;p&gt;内部：&lt;br&gt;我把原来的sw.js切换成了官方的Service-Worker.js，官方的缓存策略真的很给力的！同时换了张4K背景图，格式为WEBP，由原来的vercel拉取githubpage镜像资源改为了vercel也同步生成。同时对老掉牙的Volantis版本升级到了5.8.x版本。&lt;/p&gt;
&lt;p&gt;外部：英语字体换成了仿苏芙比字体，是不是看起来非常Cute呀？这个字体大家偷的时候注意一下哦，不要用于商用，它是仿的游戏人物手写体，而且是我从b站up那里”借”来的，很遗憾不支持中文呢~&lt;/p&gt;
&lt;p&gt;虽然修改很少，但是Volantis爆改这样的配色这样的字体，你绝对没见过第二个！&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;开源项目-NuCat&#34;&gt;&lt;a href=&#34;#开源项目-NuCat&#34; class=&#34;headerlink&#34; title=&#34;开源项目 NuCat&#34;&gt;&lt;/a&gt;开源项目 NuCat&lt;/h2&gt;&lt;p&gt;刚刚不是说最近在做项目嘛？下面就是了&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;一切的源头&#34;&gt;&lt;a href=&#34;#一切的源头&#34; class=&#34;headerlink&#34; title=&#34;一切的源头&#34;&gt;&lt;/a&gt;一切的源头&lt;/h2&gt;&lt;p&gt;正在上网的我收到了WinRar让我付费还是看广告的两难选项，我肯定是一个都不会选的啦！那么眼下我只能找其它免费的压缩软件了。虽然有7zip、bandzip等很多优秀的产品，但是有没有想过bandzip也是付费的，而7zip的界面又过于复古。对于我这种既要又要的人来说，能不能有一个开源、免费、可以换皮肤、支持多语言、又不那么臃肿的压缩软件呢？也许有但是仍未被我发现，但是有没有可能我可以自己写呢？在这种原因驱动下，我开始了NuCat压缩软件的开发~&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;工具与环境&#34;&gt;&lt;a href=&#34;#工具与环境&#34; class=&#34;headerlink&#34; title=&#34;工具与环境&#34;&gt;&lt;/a&gt;工具与环境&lt;/h2&gt;&lt;p&gt;这个很好选，按照习惯我直接选择 CMAKE+MSVC+VSCODE。虽然是单平台开发，但是CMAKE可以很方便设置依赖、设置参数，同时可读性高；MSVC则是比较优秀的CPP编译器；VSCODE和VS开发CPP都还行，但是VS有时候容易抽风呢~&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;食材的选材&#34;&gt;&lt;a href=&#34;#食材的选材&#34; class=&#34;headerlink&#34; title=&#34;食材的选材&#34;&gt;&lt;/a&gt;食材的选材&lt;/h2&gt;&lt;p&gt;数据交换和数据储存肯定是Json格式啦，而对于界面和我的需求相呼应的选项肯定不是QT、WIN UI 2&amp;#x2F;3 等等，这类不符合我喜新厌旧的习惯，而且本身我UI不是特别擅长。如果我有位朋友会写WEB，灵感不就来了吗？基于各种原因，Webview来展示界面就是最佳选项！&lt;/p&gt;
&lt;p&gt;cpp上在win32可用的webview有很多，但cef、electron等等库都与我的小而美理念冲突，要小小的才可爱嘛~于是我们可以敲定webview2作为核心技术，但是在开发中对com等等不太熟悉呢，根据onebot我们得出一切皆可one，那么webview2作为可选引擎来进行封装的库肯定是有的，可以切换浏览器内核，接口操作上比webview2提供的api好用。&lt;/p&gt;
&lt;p&gt;果然在我们的寻找中找到了webview&amp;#x2F;webview这个项目，我将这个项目作为我们的webview。然后我们还剩一个问题就是解压压缩怎么办？涉及算法而且各种格式兼容过于麻烦，摆在我选择只有两条：调用7zip的命令行或者sdk。但是调7zip命令行需要安装7zip，使用sdk又如webview2一样接口难以操作，幸好我找到bit7z库提供了对7zip的动态库操作，这样我们就找到了我们所有需要的库啦！&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;编码的选择&#34;&gt;&lt;a href=&#34;#编码的选择&#34; class=&#34;headerlink&#34; title=&#34;编码的选择&#34;&gt;&lt;/a&gt;编码的选择&lt;/h2&gt;&lt;p&gt;一切都很规范，bit7z、yyjson、webview&amp;#x2F;webview都是支持utf8的，但是存在一个问题，我是针对WinX64进行开发，采用UTF16或者ANSI调用才能正常调用接口，所以我们大部分采用UTF8，少部分WIN API进行UTF8转UTF16操作，按照规范执行~&lt;br&gt;内码：UTF8&lt;br&gt;外码：UTF16&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;开发体验&#34;&gt;&lt;a href=&#34;#开发体验&#34; class=&#34;headerlink&#34; title=&#34;开发体验&#34;&gt;&lt;/a&gt;开发体验&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;很久没有再次开发过WIN32窗口程序了，上次是N年前了，我已经很久没开发过了，本次可以说我是笨蛋了,因为WEBVIEW的com技术我没弄过，弄懂这个到放弃我直接换库了。还有就是无边框窗口保留阴影和窗口随意移动花费了很多时间，无边框会在上方有6px白边问题，主要是因为我想保留窗口阴影同时让它无边框，但是这样会存在6px非客户区。解决方法就是放弃阴影，然后用dwm api再绘出来，当然还有其它方案，比如自己用gdi绘阴影，但是确实只能说麻烦呢~&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;找罪受就来写这个，查资料没给我送走，webview&amp;#x2F;webview虽然说好于webview2体验，但是它屏蔽了大量操作，连resize webview都做不到，没办法，我只能爆改它的代码了，体验非常的差呢~&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;总结一下&#34;&gt;&lt;a href=&#34;#总结一下&#34; class=&#34;headerlink&#34; title=&#34;总结一下&#34;&gt;&lt;/a&gt;总结一下&lt;/h2&gt;&lt;p&gt;没事不要瞎折腾啦！对于写这个Nucat压缩软件就像赛博顶真一样，绕了好大一个弯路。其实WIN11预览版内置压缩软件、WIN10正式版都能解压ZIP、RAR等常见的格式，所以为什么要这么麻烦呢？大家静静等待就行，或者说不嫌弃7Zip丑，还是可以用用7zip的啦~&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;至-x2F-2024&#34;&gt;&lt;a href=&#34;#至-x2F-2024&#34; class=&#34;headerlink&#34; title=&#34;至&amp;#x2F;2024&#34;&gt;&lt;/a&gt;至&amp;#x2F;2024&lt;/h2&gt;&lt;p&gt;收回上面的话，至此讲点别的吧。马上将要到来的2024，大家元旦快乐。&lt;/p&gt;

&lt;/div&gt;</content>
        <category term="DevLog" />
        <updated>2023-12-30T16:00:00.000Z</updated>
    </entry>
    <entry>
        <id>https://10snow.com/2022/08/13/GaussWave/</id>
        <title>高斯滤波</title>
        <link rel="alternate" href="https://10snow.com/2022/08/13/GaussWave/"/>
        <content type="html">&lt;p&gt;高斯滤波的实现&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;本文提示&#34;&gt;&lt;a href=&#34;#本文提示&#34; class=&#34;headerlink&#34; title=&#34;本文提示&#34;&gt;&lt;/a&gt;本文提示&lt;/h2&gt;&lt;p&gt;本文提供了相关代码和算法仅为示例学习，并非标准案例，并且OpenCV提供了高斯滤波函数，如果遇到不明白的概念和地方可以参考引用文章理解，也可以尝试在搜索引擎上搜索相关概念和图片示例，由于本站资源原因，暂不提供图片。&lt;/p&gt;
&lt;p&gt;tips: 本文为了方便仅是灰度图片处理&lt;br&gt;如果需要彩色图片应该尝试修改代码三种通道进行分别处理或其它方法。&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;概念理解-部分来自百科等&#34;&gt;&lt;a href=&#34;#概念理解-部分来自百科等&#34; class=&#34;headerlink&#34; title=&#34;概念理解(部分来自百科等)&#34;&gt;&lt;/a&gt;概念理解(部分来自百科等)&lt;/h2&gt;&lt;h3 id=&#34;滤波&#34;&gt;&lt;a href=&#34;#滤波&#34; class=&#34;headerlink&#34; title=&#34;滤波&#34;&gt;&lt;/a&gt;滤波&lt;/h3&gt;&lt;p&gt;滤波就对图像像素点及其邻域点的灰度值按照一定的参数规则进行加权平均，可以有效滤去理想图像中叠加的高频噪声。常用的滤波有线性滤波、中值滤波、均值滤波、双边滤波、高斯滤波等。滤波有抑制噪声的作用，但这会使得图像边缘模糊。(摘自别的地方)&lt;/p&gt;
&lt;h3 id=&#34;低通滤波&#34;&gt;&lt;a href=&#34;#低通滤波&#34; class=&#34;headerlink&#34; title=&#34;低通滤波&#34;&gt;&lt;/a&gt;低通滤波&lt;/h3&gt;&lt;p&gt;低通滤波是一种过滤方式，规则为低频信号能正常通过，而超过设定临界值的高频信号则被阻隔、减弱，图像处理领域可用来模糊。&lt;/p&gt;
&lt;h3 id=&#34;高通滤波&#34;&gt;&lt;a href=&#34;#高通滤波&#34; class=&#34;headerlink&#34; title=&#34;高通滤波&#34;&gt;&lt;/a&gt;高通滤波&lt;/h3&gt;&lt;p&gt;高通滤波(high-pass filter) 是一种过滤方式，规则为高频信号能正常通过，而低于设定临界值的低频信号则被阻隔、减弱。但是阻隔、减弱的幅度则会依据不同的频率以及不同的滤波程序(目的)而改变，图像处理领域可用于锐化。&lt;/p&gt;
&lt;h3 id=&#34;高斯滤波&#34;&gt;&lt;a href=&#34;#高斯滤波&#34; class=&#34;headerlink&#34; title=&#34;高斯滤波&#34;&gt;&lt;/a&gt;高斯滤波&lt;/h3&gt;&lt;p&gt;高斯滤波是一种线性平滑滤波，适用于消除高斯噪声，广泛应用于图像处理的减噪过程，对处理呈现正态分布(高斯分布)的噪声(包括图像噪声)效果显著。&lt;br&gt;tips: 常用高斯模糊就是使用高斯滤波完成的， 高斯模糊是低通滤波的一种， 也就是滤波函数是低通高斯函数， 但是高斯滤波是指用高斯函数作为滤波函数， 至于是不是模糊，要看是高斯低通还是高斯高通， 低通就是模糊， 高通就是锐化。&lt;/p&gt;
&lt;h3 id=&#34;核算子、模板、结构都是一种&#34;&gt;&lt;a href=&#34;#核算子、模板、结构都是一种&#34; class=&#34;headerlink&#34; title=&#34;核算子、模板、结构都是一种&#34;&gt;&lt;/a&gt;核算子、模板、结构都是一种&lt;/h3&gt;&lt;p&gt;当我们进行图像处理时时，使用到的权用一个矩阵表示，可以利用该矩阵计算对应像素，同时我们叫这个矩阵为核算子、模板、结构。(示例见前提指明)&lt;br&gt;大小可小可大，并且一般为奇数，&lt;br&gt;Que:核大小为什么是都是类似3×3&amp;#x2F;5×5 奇数呢?&lt;br&gt;其中一个原因是定位中心锚点，偶数是无法确定中心点的。&lt;/p&gt;
&lt;h3 id=&#34;滤波核&#34;&gt;&lt;a href=&#34;#滤波核&#34; class=&#34;headerlink&#34; title=&#34;滤波核&#34;&gt;&lt;/a&gt;滤波核&lt;/h3&gt;&lt;p&gt;当进行滤波时，里面是核的内容是权重并且可以用于处理像素，那么该核称为滤波核。&lt;br&gt;(通俗解释 专业解释 请查询资料)&lt;/p&gt;
&lt;h3 id=&#34;归一化&#34;&gt;&lt;a href=&#34;#归一化&#34; class=&#34;headerlink&#34; title=&#34;归一化&#34;&gt;&lt;/a&gt;归一化&lt;/h3&gt;&lt;p&gt;就是生成核或者说模板加起来的权不为一，这时候我们核内每一个值除以核内总值，就实现了归一化。&lt;/p&gt;
&lt;h3 id=&#34;卷积核&#34;&gt;&lt;a href=&#34;#卷积核&#34; class=&#34;headerlink&#34; title=&#34;卷积核&#34;&gt;&lt;/a&gt;卷积核&lt;/h3&gt;&lt;p&gt;如果一个核被用于卷积那么该核也可以被称为卷积核。(通俗解释 专业解释 请查询资料)&lt;/p&gt;
&lt;h3 id=&#34;高斯核&#34;&gt;&lt;a href=&#34;#高斯核&#34; class=&#34;headerlink&#34; title=&#34;高斯核&#34;&gt;&lt;/a&gt;高斯核&lt;/h3&gt;&lt;p&gt;那么高斯核固然就是高斯分布生成的核了&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;环境与依赖&#34;&gt;&lt;a href=&#34;#环境与依赖&#34; class=&#34;headerlink&#34; title=&#34;环境与依赖&#34;&gt;&lt;/a&gt;环境与依赖&lt;/h2&gt;&lt;p&gt;Python        本次使用的编程语言&lt;br&gt;OpenCV        跨平台计算机视觉库&lt;br&gt;Windows11     本文中代码运行系统&lt;/p&gt;
&lt;h3 id=&#34;OpenCv库安装&#34;&gt;&lt;a href=&#34;#OpenCv库安装&#34; class=&#34;headerlink&#34; title=&#34;OpenCv库安装&#34;&gt;&lt;/a&gt;OpenCv库安装&lt;/h3&gt;&lt;p&gt;(清华源 可自行切换)&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;举例&#34;&gt;&lt;a href=&#34;#举例&#34; class=&#34;headerlink&#34; title=&#34;举例&#34;&gt;&lt;/a&gt;举例&lt;/h2&gt;&lt;p&gt;最终滤波核示例 (提示:权请保证和为1 此处已经归一化 但并非真实情况)&lt;br&gt;0.1 0.1 0.2&lt;br&gt;0.1 0.1 0.1&lt;br&gt;0.1 0.1 0.1&lt;/p&gt;
&lt;p&gt;为3×3网格坐标结构&lt;br&gt;该模板大小 3×3&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;算法过程&#34;&gt;&lt;a href=&#34;#算法过程&#34; class=&#34;headerlink&#34; title=&#34;算法过程&#34;&gt;&lt;/a&gt;算法过程&lt;/h2&gt;&lt;h3 id=&#34;高斯滤波实现方法&#34;&gt;&lt;a href=&#34;#高斯滤波实现方法&#34; class=&#34;headerlink&#34; title=&#34;高斯滤波实现方法&#34;&gt;&lt;/a&gt;高斯滤波实现方法&lt;/h3&gt;&lt;p&gt;看完以上相信各位并没有很多理解，并不要紧，联系实际我们进一步进行&lt;br&gt;高斯滤波通常情况下有两种实现方式，一是用离散化窗口滑窗卷积， 另一种通过傅里叶变换，其中第一种毕竟常见，可能这时候有人又问了，这又是什么，别急，咱先慢慢来，离散化窗口滑窗卷积其实就是进行有限次的移动核运算区域的卷积运算，那么我们可以开始了。&lt;/p&gt;
&lt;h3 id=&#34;算法过程-1&#34;&gt;&lt;a href=&#34;#算法过程-1&#34; class=&#34;headerlink&#34; title=&#34;算法过程&#34;&gt;&lt;/a&gt;算法过程&lt;/h3&gt;&lt;p&gt;0.图像灰度处理 (为了方便)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;生成滤波核&lt;/li&gt;
&lt;li&gt;进行卷积处理图像&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;生成滤波核&#34;&gt;&lt;a href=&#34;#生成滤波核&#34; class=&#34;headerlink&#34; title=&#34;生成滤波核&#34;&gt;&lt;/a&gt;生成滤波核&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://s2.loli.net/2022/08/14/4dgAQ2RCInSM8m6.gif&#34; class=&#34;lazyload&#34; data-srcset=&#34;https://s2.loli.net/2022/08/14/4dgAQ2RCInSM8m6.gif&#34; srcset=&#34;data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==&#34; alt=&#34;CodeCogsEqn.gif&#34;&gt;&lt;br&gt;(此处为一维高斯函数)&lt;/p&gt;
&lt;p&gt;sigma 为标准差 图像平滑程度取决于该值&lt;br&gt;我们使用高斯函数进行生成对应滤波核&lt;br&gt;离中心点越远那么边缘值的权值越小，我们依照高斯二维函数就可以生成对应滤波核。&lt;br&gt;代码具体参考如下&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;def GaussKernel(size,k,sigma):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    _t = np.zeros((size,size),np.float32)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    for i in range (size):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        for j in range (size):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            norm = math.pow(i-k,2) + pow(j-k,2)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            _t[i,j] = math.exp(-norm/(2*math.pow(sigma,2)))/2*math.pi*pow(sigma,2)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    sum = np.sum(_t)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    kernel = _t/sum&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    return kernel&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;卷积生成&#34;&gt;&lt;a href=&#34;#卷积生成&#34; class=&#34;headerlink&#34; title=&#34;卷积生成&#34;&gt;&lt;/a&gt;卷积生成&lt;/h3&gt;&lt;p&gt;然后我们使用对应的滤波权值进行乘以像素值，就可以生成新值，但是滤波核仅3×3大小，我们在原图像每一个像素点运算一次，即可生成新的图形。&lt;br&gt;运算为: 每个像素点周围点 权×值 的和为中心点新值。&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;def mygaussFilter(img_gray,kernel):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    h,w = img_gray.shape&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    k_h,k_w = kernel.shape&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    for i in range(int(k_h/2),h-int(k_h/2)):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        for j in range(int(k_h/2),w-int(k_h/2)):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            sum = 0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            for k in range(0,k_h):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                for l in range(0,k_h):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    sum += img_gray[i-int(k_h/2)+k,j-int(k_h/2)+l]*kernel[k,l]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            img_gray[i,j] = sum&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    return img_gray&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;样例代码&#34;&gt;&lt;a href=&#34;#样例代码&#34; class=&#34;headerlink&#34; title=&#34;样例代码&#34;&gt;&lt;/a&gt;样例代码&lt;/h2&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;import math&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;import cv2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;import numpy as np&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;def GaussKernel(size,k,sigma):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    _t = np.zeros((size,size),np.float32)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    for i in range (size):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        for j in range (size):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            norm = math.pow(i-k,2) + pow(j-k,2)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            _t[i,j] = math.exp(-norm/(2*math.pow(sigma,2)))/2*math.pi*pow(sigma,2)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    sum = np.sum(_t)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    kernel = _t/sum&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    return kernel&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;def mygaussFilter(img_gray,kernel):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    h,w = img_gray.shape&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    k_h,k_w = kernel.shape&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    for i in range(int(k_h/2),h-int(k_h/2)):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        for j in range(int(k_h/2),w-int(k_h/2)):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            sum = 0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            for k in range(0,k_h):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                for l in range(0,k_h):&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    sum += img_gray[i-int(k_h/2)+k,j-int(k_h/2)+l]*kernel[k,l]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            img_gray[i,j] = sum&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    return img_gray&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;if __name__ == &amp;#x27;__main__&amp;#x27;:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img = cv2.imread(&amp;quot;demo.jpg&amp;quot;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_g = img_gray.copy()&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    k=1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    size = 2*k+1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    kernel = gausskernel(size,k,1.5)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    print(kernel)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_B,img_G,img_R = cv2.split(img)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_gauss_B = mygaussFilter(img_B,kernel)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_gauss_G = mygaussFilter(img_G,kernel)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_gauss_R = mygaussFilter(img_R,kernel)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_gauss = cv2.merge([img_gauss_B,img_gauss_G,img_gauss_R])&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    img_comp = np.hstack((img,img_gauss))&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    cv2.imshow(&amp;quot;gauss&amp;quot;,img_comp)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    cv2.waitKey(0)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;直接OpenCV操作-非原理实现方案-使用封装方法&#34;&gt;&lt;a href=&#34;#直接OpenCV操作-非原理实现方案-使用封装方法&#34; class=&#34;headerlink&#34; title=&#34;直接OpenCV操作(非原理实现方案 使用封装方法)&#34;&gt;&lt;/a&gt;直接OpenCV操作(非原理实现方案 使用封装方法)&lt;/h2&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;import cv2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Gn=cv2.imread(&amp;quot;Gaussian_noise.jpg&amp;quot;) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Gf=cv2.GaussianBlur(Gn,(3,3),0,0)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cv2.imshow(&amp;quot;噪声图像&amp;quot;,Gn)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cv2.imshow(&amp;quot;滤波图像&amp;quot;,Gf)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cv2.waitKey()&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cv2.destroyAllWindows()&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;Que-边界点的处理&#34;&gt;&lt;a href=&#34;#Que-边界点的处理&#34; class=&#34;headerlink&#34; title=&#34;Que: 边界点的处理&#34;&gt;&lt;/a&gt;Que: 边界点的处理&lt;/h2&gt;&lt;p&gt;如果一个点处于边界，周边没有足够的点，怎么办？&lt;br&gt;一个变通方法，就是把已有的点拷贝到另一面的对应位置，模拟出完整的矩阵。&lt;br&gt;当然我们这里很简单，就是进行矩阵补零上去，用零进行模拟完整矩阵。&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#总结&#34; class=&#34;headerlink&#34; title=&#34;总结&#34;&gt;&lt;/a&gt;总结&lt;/h2&gt;&lt;p&gt;高斯滤波可以让图像高斯噪声降低，并且平滑图像，并且opencv等库已经提供封装，我们可以很快的使用&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;文章引用&#34;&gt;&lt;a href=&#34;#文章引用&#34; class=&#34;headerlink&#34; title=&#34;文章引用&#34;&gt;&lt;/a&gt;文章引用&lt;/h2&gt;&lt;p&gt;高斯滤波&lt;br&gt;&lt;a href=&#34;https://blog.csdn.net/weixin_51571728/article/details/121527964&#34;&gt;https://blog.csdn.net/weixin_51571728/article/details/121527964&lt;/a&gt;&lt;br&gt;高斯滤波核&lt;br&gt;&lt;a href=&#34;https://blog.csdn.net/qqq777_/article/details/112800310&#34;&gt;https://blog.csdn.net/qqq777_/article/details/112800310&lt;/a&gt;&lt;br&gt;有关线性滤波、滤波核的基本概念(概念理解)&lt;br&gt;&lt;a href=&#34;https://blog.csdn.net/weixin_42664622/article/details/103672899&#34;&gt;https://blog.csdn.net/weixin_42664622/article/details/103672899&lt;/a&gt;&lt;br&gt;数字图像处理基础 — 高斯滤波&lt;br&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/82569305&#34;&gt;https://zhuanlan.zhihu.com/p/82569305&lt;/a&gt;&lt;br&gt;图像滤波原理(不推荐)&lt;br&gt;&lt;a href=&#34;https://view.inews.qq.com/a/20220425A06HHF00&#34;&gt;https://view.inews.qq.com/a/20220425A06HHF00&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class=&#34;story post-story&#34;&gt;&lt;h2 id=&#34;提示&#34;&gt;&lt;a href=&#34;#提示&#34; class=&#34;headerlink&#34; title=&#34;提示&#34;&gt;&lt;/a&gt;提示&lt;/h2&gt;&lt;p&gt;该文章并不准确，如果有错误请积极指出。&lt;/p&gt;

&lt;/div&gt;</content>
        <category term="DevLog" />
        <category term="Gauss" />
        <updated>2022-08-13T16:00:00.000Z</updated>
    </entry>
</feed>
