在HTML5 canvas里用卷积核进行图像处理的方法


Posted in HTML / CSS onMay 02, 2018

卷积什么是卷积?

就跳过一些用专业属于描述专业术语看完懵逼的解释了,

语文成绩很差的我尝试从字面解释什么是卷积...

卷,理解成一种压缩;积,乘积,积累;

卷积需要一个卷积核,通常是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的位置,就是这样“扫描并处理”每一个数据

边缘怎么办?

  1. 常数填充
  2. 复制边缘像素

突然的深度拓展

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

canvas

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

canvas 绘制图片

ctx.drawImage(image, x, y)

在HTML5 canvas里用卷积核进行图像处理的方法

canvas 转换为 ImageData

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

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

所以每一个点都会表示为:

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

卷积 + ImageData = ?

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

在HTML5 canvas里用卷积核进行图像处理的方法

卷积就是如此神奇?

在 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.outputCtx
  let output = ctx.createImageData(input)
  let w = input.width,
    h = input.height
  let iD = input.data,
    oD = output.data
  for (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 + c
        oD[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/canvas-img-process

测试网址,附带彩蛋嘻嘻嘻?https://ssshooter.github.io/canvas-img-process/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3轻松实现圆角效果
Nov 09 HTML / CSS
45个非常奇妙的CSS3 特性应用示例
Jan 01 HTML / CSS
纯css实现照片墙3D效果的示例代码
Nov 13 HTML / CSS
CSS3实现红包抖动效果
Dec 23 HTML / CSS
HTML5中视频音频的使用详解
Jul 07 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
Apr 04 HTML / CSS
Html5实现如何在两个div元素之间拖放图像
Mar 29 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
Jun 23 HTML / CSS
使用HTML5的Notification API制作web通知的教程
May 08 HTML / CSS
带你认识HTML5中的WebSocket
May 22 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
Mar 13 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
Oct 17 HTML / CSS
HTML5新增的标签和属性归纳总结
May 02 #HTML / CSS
HTML5 video视频字幕的使用和制作方法
May 03 #HTML / CSS
html5调用摄像头功能的实现代码
May 07 #HTML / CSS
探究 canvas 绘图中撤销(undo)功能的实现方式详解
May 17 #HTML / CSS
详解canvas在圆弧周围绘制文本的两种写法
May 22 #HTML / CSS
HTML5 device access 设备访问详解
May 24 #HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
May 25 #HTML / CSS
You might like
PHP 七大优势分析
2009/06/23 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
php URL跳转代码 减少外链
2011/06/25 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
详解django中使用定时任务的方法
2018/09/27 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
django rest framework使用django-filter用法
2020/07/15 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
帕克纽约:PARKER NY
2018/12/09 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
教师岗位职责
2013/11/17 职场文书
cf搞笑广告词
2014/03/14 职场文书
事业单位鉴定材料
2014/05/25 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python