卷积

什么是卷积?

就跳过一些用专业属于描述专业术语看完懵逼的解释了,
语文成绩很差的我尝试从字面解释什么是卷积...
,理解成一种压缩;,乘积,积累;
卷积需要一个卷积核,通常是3x3或5x5的方阵,
例如这样

// 一个3x3卷积核
0 0 0
0 1 0
0 0 0

我们要怎么用卷积核处理数据呢?
下面是一个例子:

// 下面是一堆排成方阵的数据
// 这是我们的数据源
1 3 5 1 3 5 1 3 5
4 5 6 1 3 5 1 3 5
4 5 6 1 3 5 1 3 5
4 5 6 1 3 5 1 3 5

我们将要用卷积核“扫描并处理”每一个数据,
例如要处理第二行第二列的5

1 3 5     0 0 0
4 5 6  *  0 1 0
4 5 6     0 0 0

我们把5周围的数字抽出来,然后把两个方阵位置相同的数字相乘然后相加,
得出5,这是当然的,因为这个卷积核做的就是输出原数据?

-1 -1 -1
-1  8 -1
-1 -1 -1

同样的原理,试试另一个不同的卷积核

1 3 5     -1 -1 -1
4 5 6  *  -1  8 -1
4 5 6     -1 -1 -1

我们得到的是

  1*-1 + 3*-1 + 5*-1
+ 4*-1 + 5*8  + 6*-1
+ 4*-1 + 5*-1 + 6*-1
= 6

然后用得出来的6放入原来5的位置,就是这样“扫描并处理”每一个数据

边缘怎么办?

  • 常数填充
  • 复制边缘像素

突然的深度拓展

卷积在深度学习中十分重要,下面是一个可视化CNN(卷积神经网络)的卷积过程
http://scs.ryerson.ca/~aharle...

canvas

<canvas>是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素.它可以用于绘制图表、制作图片构图或者制作简单的(以及不那么简单的)动画。

canvas 绘制图片

ctx.drawImage(image, x, y)

canvas 转换为 ImageData

ctx.getImageData(sx, sy, sw, sh);
// 返回 ImageData

ImageData 数据是 Uint8ClampedArray ,它描述了一个一维数组,包含以 RGBA 顺序的数据,数据使用 0 至 255(包含)的整数表示。
所以每一个点都会表示为:

// 这样仅仅是一个像素点的数据
R   G   B   A
255 255 0 255

卷积 + ImageData = ?

图像归根到底就是一大堆的颜色点矩阵,我们完全可以把颜色点代替上面的数字矩阵处理,
不同的卷积核对图片的处理结果如下(图片来自维基百科)

卷积就是如此神奇?

在 canvas 中实现卷积处理

以下是一个 JavaScript 对 canvas 输出的 ImageData 进行卷积的实例:

/* * 参数中的 kernel 就是卷积核方阵,不过顺着排列成了一个九位的数组* 像是这样 [-1, -1, -1, -1, 8, -1, -1, -1, -1]* offset 对RGBA数值直接增加,表现为提高亮度* 下面的for循环* y 代表行,x 代表列,c 代表RGBA*/
convolutionMatrix(input, kernel, offset = 0) {let ctx = this.outputCtxlet output = ctx.createImageData(input)let w = input.width,h = input.heightlet iD = input.data,oD = output.datafor (let y = 1; y < h - 1; y += 1) {for (let x = 1; x < w - 1; x += 1) {for (let c = 0; c < 3; c += 1) {let i = (y * w + x) * 4 + coD[i] =offset +(kernel[0] * iD[i - w * 4 - 4] +kernel[1] * iD[i - w * 4] +kernel[2] * iD[i - w * 4 + 4] +kernel[3] * iD[i - 4] +kernel[4] * iD[i] +kernel[5] * iD[i + 4] +kernel[6] * iD[i + w * 4 - 4] +kernel[7] * iD[i + w * 4] +kernel[8] * iD[i + w * 4 + 4]) /this.divisor}oD[(y * w + x) * 4 + 3] = 255}}ctx.putImageData(output, 0, 0)
}

成品代码

https://github.com/ssshooter/...

测试网址,附带彩蛋嘻嘻嘻?

https://ssshooter.github.io/c...

在HTML5 canvas里用卷积核进行图像处理相关推荐

  1. html canvas 图像边缘提取,在HTML5 canvas里用卷积核进行图像处理

    卷积 什么是卷积? 就跳过一些用专业属于描述专业术语看完懵逼的解释了, 语文成绩很差的我尝试从字面解释什么是卷积... 卷,理解成一种压缩:积,乘积,积累: 卷积需要一个卷积核,通常是3x3或5x5的 ...

  2. HTML5 canvas里的drawImage用法

    关于canvas无法通过drawImage加载的原因 首先我们先来理解在html里图片的加载时是异步的. (设置src本身是同步的,但是浏览器下载和显示图片是异步的.) 在资源还没有加载完成的时候就执 ...

  3. html5 Canvas画图教程(5)—canvas里画曲线之arc方法

    本文转自:http://www.jb51.net/html5/70317.html 在canvas画线条这篇文章中,我讲了画直线的方法,按理这篇画曲线的文章早该发了,但由于canvas画曲线比较特殊, ...

  4. html5图片上写字,Html5 canvas画图教程20:在canvas里写字

    文章写到现在才发现我忘了介绍在canvas上写字的方法,呃,这篇补上. 其实在canvas里写字是很简单的,他有两个原生方法,即strokeText(描边文字)和fillText(填充文字)--一看就 ...

  5. html5 canvas 画一个矩形,在矩形里添加文字。

    <canvas id="myCanvas" width="1000" height="580" style="border: ...

  6. php画布怎么清除,JavaScript_JavaScript html5 canvas画布中删除一个块区域的方法,本文实例讲述了html5 canvas画布 - phpStudy...

    JavaScript html5 canvas画布中删除一个块区域的方法 本文实例讲述了html5 canvas画布中删除一个块区域的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 附:图 ...

  7. Html5 Canvas 扫雷 (IE9测试通过)

    扫雷是一个非常经典的游戏,记得在第一次接触的windows 3.22 上就有扫雷了,到现在的Win7,依然保留着这个经典的游戏,结合Html5 Canvas,模仿Win7的UI,将老板扫雷进行了升级. ...

  8. HTML5 Canvas

    HTML5 Canvas 转自:https://blog.csdn.net/u012468376/article/details/73350998 一.canvas简介 ​  <canvas&g ...

  9. HTML5 Canvas像素处理常用接口

    内容概要:本文通过简单的代码实例,以及略猥琐的图片demo,展示了canvas在图像像素数据操作方面的常用接口.至于如何利用这几个接口实现更复杂的效果,则会在后续章节里继续讲述. 一.canvas图片 ...

最新文章

  1. Thrift的接口定义语言IDL
  2. php 进程 线程,php进程还是线程
  3. 3.以太坊之秘钥文件
  4. Spring boot修改静态资源映射
  5. 实战 MDT 2012(六)---基于MAC地址的部署
  6. “苏木”边上的小牛犊
  7. 让vs2008支持jQuery的智能提示!
  8. python为list实现find方法
  9. DevExpress XtraGrid网格控件示例四:初始化新建行的单元格
  10. 【故障处理】ORA-19809错误处理
  11. mac版本 sadptool_EZParkTools下载-智慧停车维护工具 v1.0 官方版 - 安下载
  12. GAMP|Visual Studio 2019环境下配置GAMP
  13. 智慧酒店系统开发给现代酒店运营注入创新活力
  14. matlab仿真三相整流电路设计,基于MATLAB的三相整流电路仿真研究毕业设计
  15. UWP 全屏与退出全屏
  16. 网易云音乐评论抓取(js逆向)
  17. 控制面板Plesk, cPanel, DirectAdmin, whmcs,WDCP, AMH比较
  18. 等额本息人人都会计算!
  19. 微信视频号标题怎么写吸引眼球
  20. kali-linux-2018.2-i386.iso

热门文章

  1. elasticsearch中的优先级线程池
  2. maven 打包替换文件_使用Maven打包生成文件 | 学步园
  3. Netty入门笔记-Linux网络I/O模型介绍
  4. python设计模式7-桥接模式
  5. 一文说清ZooKeeper的实现原理
  6. 浅谈分布式一致性协议之3PC
  7. [Android]Thread线程入门3--多线程
  8. 深究Spring中Bean的生命周期
  9. 使用VisualTreeHelper.GetDrawing(Visual v)枚举所有Visual内容的对象
  10. AGG第三十一课 pattern_perspective样式透明