fabricjs 实现图像的二值化功能

news2025/1/11 22:50:11

一、效果图

在这里插入图片描述

二、图像二值化的作用

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

三、实现思路

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


    <div>
      <canvas
        ref="grayCanvas"
        :width="canvasProp.width"
        :height="canvasProp.height"
      ></canvas>
      <canvas
        ref="binaryCanvas"
        :width="canvasProp.width"
        :height="canvasProp.height"
      ></canvas>
    </div>

    <!-- 隐藏的 canvas -->
    <canvas
      ref="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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lumerical 光纤模式仿真

Lumerical 光纤模式仿真 引言正文步骤 1------创建光纤的纤芯设置名称,位置及尺寸参数设置材料参数旋转结构使其朝向 x 方向放置步骤2------创建包层结构设置名称,位置及尺寸参数设置材料参数旋转结构使其朝向 x 方向放置设置透明度,是我们能够看到纤芯结构设置 FDE Solver设…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程 ​ 大家好&#xff0c;经过前几期的介绍&#xff0c;对于X3派上的Yolo模型部署&#xff0c;我们已经可以进行到最后一步了 ​ 今天给大家带来&#xff0c;转模型的关键步骤&#xff0…

苹芯科技发布新AI模型,引领全球轻量级AI应用革命

苹芯科技&#xff0c;一家在全球AI技术领域中不断创新的公司&#xff0c;于2月28日宣布推出其最新研发的轻量级AI模型。这款新模型旨在为开发者和企业提供更高效、更易访问的人工智能工具&#xff0c;尤其强调在数据敏感和计算资源受限的环境下的应用潜力。 在谷歌刚刚推出Gemm…

普元MDM主数据管理系统与微软Dynamic CRM系统(新加坡节点)集成案例

一、项目背景 某工程机械集团是中国工程机械产业奠基者、开创者和引领者&#xff0c;是工程机械行业具有全球竞争力、影响力的千亿级龙头企业。公司主要指标始终稳居中国工程机械行业第1位 客户需要将物料和配件等主数据和海外系统进行对接&#xff0c;由SAP PO在中间对接海…

【开发视角】大模型 RAG 检索增强生成究竟是什么

【大白话讲懂】大模型 RAG 检索增强生成 话先说在前面&#xff0c;本文不讲不会讲太多原理&#xff0c;仅面向工程开发&#xff0c;从工作流程的宏观角度进行梳理&#xff0c;旨在快速上手。 RAG 是什么 基本定义 让我们先来解释名词&#xff0c;看看宏观框架。 RAG 的意思…

Opencv调用yolov5的onnx文件时报错记录

Opencv调用yolov5的onnx文件时报错记录 报错内容&#xff1a; Error: Unspecified error (> Node [Powai.onnx]:(onnx_node!/model.24/Pow) parse error: OpenCV(4.6.0) F:\opencv-4.6.0\opencv-4.6.0\modules\dnn\src\onnx\onnx_importer.cpp:601: error: (-215:Assertio…

C++ vector的基本使用(待补全)

std::vector 是C标准模板库(STL)中的一个非常重要的容器类&#xff0c;它提供了一种动态数组的功能。能够存储相同类型的元素序列&#xff0c;并且可以自动管理存储空间的大小&#xff0c;以适应序列大小变化&#xff0c;处理元素集合的时候很灵活 1. vector的定义 构造函数声…

西安电子科技大学2025届毕业生生源信息

2025届本科毕业生专业分布一览表 2025届硕士毕业生专业分布一览表 2025届博士毕业生专业分布一览表 2025届本科毕业生生源地分布 左右滑动查看更多 2025届硕士毕业生生源地分布 2025届博士毕业生生源地分布

小红书笔试-选择题

HTTP/2.0默认长连接。选B ABC 一个类可以实现多个接口&#xff0c;一个接口可以继承一个或多个接口&#xff1a; 这是正确的。Java 支持多重继承的变体&#xff0c;即一个类可以实现多个接口&#xff0c;以获取多个接口中定义的方法。同时&#xff0c;一个接口可以通过 extends…

假如家里太大了,wifi连不上了怎么办

最近有个土豪朋友抱怨&#xff0c;他家里太大了&#xff0c;一个路由器的Wi-Fi信号根本无法覆盖他们家的每个房间&#xff0c;都没办法上网看奥运会比赛了。&#xff08;还好我是穷人&#xff0c;就没有这种烦恼T_T&#xff09;。 然后我问他为何不用一个路由器作主路由器&…

安卓常用控件ListView

文章目录 ListView的常用属性ListView的常用APIListView的简单使用 ListView是一个列表样式的 ViewGroup&#xff0c;将若干 item 按行排列。它是一个很基本的控件也是 Android 中最重要的控件之一。它可以实现多个 View 的垂直排列并支持滚动显示效果。 ListView的常用属性 常…

数论——绝对素数、素数筛法、埃氏筛法、欧拉筛法、最大公约数

绝对素数 绝对素数是指一个素数在其十进制表示下&#xff0c;无论是从左向右读还是从右向左读&#xff0c;所得到的数仍然是素数。 例如&#xff0c;13 是一个素数&#xff0c;从右向左读是 31&#xff0c;31 也是素数&#xff0c;所以 13 是一个绝对素数。 #include <io…

小红书无货源选品逻辑和爆品思路(图文解析)

了解用户的购物习惯、需求偏好以及日常搜索行为&#xff0c;是选品的重要前提。选品不是嘴巴一张这么简单的事情&#xff0c;是需要通过长期积累及网感来分析。记住&#xff1a;人-货-场&#xff0c;这个原则。比如明知道小红书上的年前女性用户多&#xff0c;你偏偏来卖一台挖…

悠易科技周文彪:创始人专注度很重要,一旦战略分散无法形成合力 | 中国广告营销行业资本报告深访④

周文彪&#xff08;悠易科技CEO&#xff09; 问&#xff1a;近年来广告营销行业主要的融资事件发生在营销技术领域。您对此有何评论&#xff1f; Roy&#xff1a;Adtech最早从2007年前后开始发展&#xff0c;差不多十年的时间&#xff0c;因为广告技术帮助企业成长&#xff0c…

【时时三省】unity test 测试框架 使用 code blocks 移植(核心文件:unity.c, unity_fixture.c)

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 目录 1&#xff0c;移植介绍 2&#xff0c;使用 Code::Blocks 17.12 创建工程 3&#xff0c;搬移文件入工程目录 4&#xff0c;更改代码 5&#xff0c;向工程添加文件 6&#xff0c;运…

解锁PDF新姿势:2024年PDF转图片工具精选

随着数字化办公的普及和文档处理需求的日益增长&#xff0c;PDF转图片工具已成为日常工作中不可或缺的一部分。这些工具不仅帮助用户轻松地将PDF文件转换为图片格式&#xff0c;还提供了丰富的编辑、转换和批量处理功能&#xff0c;极大地提高了工作效率。 1.福昕PDF转换大师&…

数据结构实验报告-栈

实 验 三 报 告 一、实验目的 1.掌握栈的定义、特点、逻辑结构&#xff0c;理解栈的抽象数据类型。 2.熟练掌握顺序栈的结构类型定义、特点和基于顺序栈的基本运算的实现。 3.熟练掌握链栈的结构类型定义、特点和基于链栈的基本运算的实现。 4.理解递归算法执行过程中栈的…

ssh网络协议(服务名sshd,端口22)

目录 前言 配置文件&#xff08;/etc/ssh/sshd_config&#xff09; 配置文件内容 自己可以添加的设置&#xff1a; 注意&#xff01;&#xff1a; ssh连接登录演示 scp文件传输 登录验证方式 密码验证登录 秘钥验证登录 配置ssh密钥对验证登录 生成密钥对&#xff…

JavaWeb基础3:会话/过滤器/监听器

JavaWeb基础3&#xff1a;会话/过滤器/监听器 (qq.com)

海尔、希亦、米博洗地机哪个好用?海尔、希亦、米博洗地机实测PK

洗地机相比普通清洁工具&#xff0c;拥有科学的设计&#xff0c;而且清洁技术专业&#xff0c;能够把地面上的污渍、灰尘、毛发等通通清理干净&#xff0c;保持地面光洁。比起手动清理&#xff0c;它还能减少地面和空气的细菌滋生&#xff0c;可以说是居家必备的清洁神器了。不…