您现在的位置是:网站首页> 编程资料编程资料
在HTML5 canvas里用卷积核进行图像处理的方法canvas 基础之图像处理的使用
2023-10-16
258人已围观
简介 本篇文章主要介绍了在HTML5 canvas里用卷积核进行图像处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
卷积什么是卷积?
就跳过一些用专业属于描述专业术语看完懵逼的解释了,
语文成绩很差的我尝试从字面解释什么是卷积...
卷,理解成一种压缩;积,乘积,积累;
卷积需要一个卷积核,通常是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/~aharley/vis/conv/
canvas
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.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/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关内容
- 如何使用localstorage代替cookie实现跨域共享数据问题html5的localstorage详解HTML5 LocalStorage 本地存储刷新值还在HTML5 localStorage使用总结HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常HTMl5的存储方式sessionStorage和localStorage详解
- 教你如何一步一步用Canvas写一个贪吃蛇H5 canvas实现贪吃蛇小游戏
- html5/css3响应式页面开发总结 CSS3移动端vw+rem不依赖JS实现响应式布局的方法CSS banner图响应式居中显示的方法详解使用CSS3的@media来编写响应式的页面 jQuery和CSS3响应式轮播插件jcSlider纯CSS3大转盘抽奖示例代码(响应式、可配置)CSS3 media queries + jQuery实现响应式导航CSS 响应式布局系统的实例代码
- 传统HTML页面实现模块化加载的方法在HTML里加载摄像头的方法基于HTML代码实现图片碎片化加载功能html5用video标签流式加载的实现HTML5 图片预加载的示例代码HTML页面缩小后显示滚动条的示例代码h5页面背景图很长要有滚动条滑动效果的实现HTML5实现直播间评论滚动效果的代码html+css实现滚动到元素位置显示加载动画效果
- HTML5 和小程序实现拍照图片旋转、压缩和上传功能HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题微信小程序之html5 canvas绘图并保存到系统相册基于Jscex +HTML5 Canvas 制作的抽奖小程序HTML5跳转小程序wx-open-launch-weapp的示例代码
- 详解canvas drawImage()方法绘制图片不显示的问题HTML5 Canvas API中drawImage()方法的使用实例canvas绘制图片drawImage使用方法
- 全民英雄 仙女龙怎么样 仙女龙技能详解_手机游戏_游戏攻略_
- 我叫MT 黑沼泽副本艾尔努斯打法攻略推荐阵容_手机游戏_游戏攻略_
- 全民英雄 怎么提高酒馆上限的方法_手机游戏_游戏攻略_
- 我叫MT 3.1精英能源计算者如何刷 阵容推荐_手机游戏_游戏攻略_
