当前位置: 首页 > news >正文

fabricjs 实现图像的二值化功能

一、效果图

在这里插入图片描述

二、图像二值化的作用

二值化是图像处理中常用的一种方法,其作用是将灰度图像转换为二值图像,即将图像中的像素点根据其灰度值分成两类:黑色和白色。这种处理方法可以帮助我们更清晰地识别图像中的目标,简化图像的复杂度,提高图像的处理速度和准确性。

三、实现思路

1、获取框选的图片,进行截图

<div><canvasref="grayCanvas":width="canvasProp.width":height="canvasProp.height"></canvas><canvasref="binaryCanvas":width="canvasProp.width":height="canvasProp.height"></canvas></div><!-- 隐藏的 canvas --><canvasref="hiddenCanvas":width="canvasProp.width":height="canvasProp.height"style="display: none;"></canvas>// 根据框选的数据,对原图进行截图getCanvasImageData() {const viewportTransform = this.fabricCanvas.viewportTransform;const zoom = this.fabricCanvas.getZoom();let selectedCoords = null;this.fabricCanvas.getObjects().forEach(rect => {const coords = [];const points = rect.get("aCoords");Object.keys(points).forEach(key => {let point = points[key];const actualX = (point.x - viewportTransform[4]) / zoom;const actualY = (point.y - viewportTransform[5]) / zoom;coords.push([Math.round(actualX), Math.round(actualY)]);});// 假设只有一个矩形对象,我们只需获取一个对象的坐标selectedCoords = coords;});if (selectedCoords) {// 获取矩形区域的最小和最大坐标const minX = Math.min(...selectedCoords.map(coord => coord[0]));const minY = Math.min(...selectedCoords.map(coord => coord[1]));const maxX = Math.max(...selectedCoords.map(coord => coord[0]));const maxY = Math.max(...selectedCoords.map(coord => coord[1]));const width = maxX - minX;const height = maxY - minY;// 从隐藏的 canvas 中获取选中区域的图像数据const ctx = this.$refs.hiddenCanvas.getContext("2d");return ctx.getImageData(minX, minY, width, height);}return null;},

页面中要有3个canvas,grayCanvas 画灰度图片,binaryCanvas画二值化图片,hiddenCanvas 画原始的图片便于截图

2、对图片进行灰度处理
转化为灰度图片,放在灰度画布中

  convertToGrayScale(imageData) {const data = imageData.data;for (let i = 0; i < data.length; i += 4) {const avg = 0.3 * data[i] + 0.59 * data[i + 1] + 0.11 * data[i + 2];data[i] = avg;data[i + 1] = avg;data[i + 2] = avg;}return imageData;},applyGrayScale() {const imageData = this.getCanvasImageData();const grayImageData = this.convertToGrayScale(imageData);const grayCtx = this.$refs.grayCanvas.getContext("2d");grayCtx.putImageData(grayImageData, 0, 0);this.applyThreshold();},

3、拖动滑块,根据阈值对图片进行二值化处理

    applyThreshold() {const grayCtx = this.$refs.grayCanvas.getContext("2d");const grayImageData = grayCtx.getImageData(0,0,this.canvasProp.width,this.canvasProp.height);const data = grayImageData.data;for (let i = 0; i < data.length; i += 4) {const avg = data[i];const value = avg > this.threshold ? 255 : 0;data[i] = value;data[i + 1] = value;data[i + 2] = value;}const binaryCtx = this.$refs.binaryCanvas.getContext("2d");binaryCtx.putImageData(grayImageData, 0, 0);},

4、添加滑块移动的监听

   this.fabricCanvas.on("object:modified", this.applyGrayScale);this.fabricCanvas.on("object:added", this.applyGrayScale);this.fabricCanvas.on("object:removed", this.applyGrayScale);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机网络基础 - 计算机网络和因特网(2)
  • ARM/Linux嵌入式面经(二十):地平线嵌入式开发
  • SQL进阶技巧:数据预处理如何对数据进行分桶【分箱】?
  • SD8223LC 首鼎SHOUDING单键电容式触摸IC SOT23-6
  • 面试经典算法150题系列-h指数
  • Jenkins参数化构建
  • C# 使用 NLog 输出日志到文件夹
  • springboot新农村综合展示平台-计算机毕业设计源码41793
  • 震惊!一男子深夜燥热难耐,竟然偷偷起身打开电脑并开始 学习c++入门基础(下)
  • 一个很变态却非常实用的发论文的新方向,【Transformer+目标检测】
  • 为什么有的地方笔记本经常连不上wifi,而手机可以?
  • Linux学习第56天:RGB转HDMI
  • Radiant Photo 1.4.1 AI智能完美照片修图插件支持PS ai beta
  • 珠海市举办“数智赋能产业转型与创新培训专场”活动
  • 【天机学堂】面试总结
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • angular学习第一篇-----环境搭建
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Docker: 容器互访的三种方式
  • gcc介绍及安装
  • Javascript弹出层-初探
  • JavaScript异步流程控制的前世今生
  • log4j2输出到kafka
  • react-native 安卓真机环境搭建
  • React-生命周期杂记
  • Shell编程
  • Spark RDD学习: aggregate函数
  • Vue.js 移动端适配之 vw 解决方案
  • Vue2.x学习三:事件处理生命周期钩子
  • vuex 笔记整理
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 面试总结JavaScript篇
  • 深入浏览器事件循环的本质
  • #QT(智能家居界面-界面切换)
  • #Ubuntu(修改root信息)
  • (2)MFC+openGL单文档框架glFrame
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (C11) 泛型表达式
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (四)JPA - JQPL 实现增删改查
  • (一)u-boot-nand.bin的下载
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net Core 中间件与过滤器
  • .net dataexcel 脚本公式 函数源码
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net面试题4
  • .net中应用SQL缓存(实例使用)
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • ::
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [12] 使用 CUDA 进行图像处理
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)