基于H5实现图像处理:灰度化和二值化

图像二值化处理(全局阈值 自适应阈值 手动阈值操作以及直方图画法) 阅读详情

概述

1. 利用h5的canvas画布实现图片绘制
2. 灰度化和二值化算法参考自
	https://www.cnblogs.com/rushoooooo/articles/2366154.html
3. 前置知识点: js, canvas

效果概览

原图
灰度化
二值化

完整代码

<!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>
<body>
    <p>
      <input type="button" value="灰度化" onclick="javascript:ProcessToGrayImage();">
      <input type="button" value="二值化" onclick="javascript:OTSUAlgorithm();">
    </p>
    <canvas id="myCanvas"></canvas>
</body>


<!-- demo1. 创建画布 -->
<script type="text/javascript">
  var img=new Image();
  //解决跨域问题
  img.crossOrigin = "Anonymous";
  img.src="http://img2.imgtn.bdimg.com/it/u=626341007,68367128&fm=214&gp=0.jpg";

  var canvas;
  var ctx;
  //图片加载完成触发
  img.onload = function(){ 
      canvas=document.getElementById("myCanvas");
      canvas.width = img.width;  
      canvas.height = img.height;  
      ctx=canvas.getContext("2d");
      ctx.drawImage(img,0,0,img.width,img.height);
  }  
</script>


<!-- demo2: 彩色图像灰度化 -->
<script type="text/javascript">
  
  //彩色图像灰度化
  function ProcessToGrayImage(){
    //取得图像数据
    var imgData=ctx.getImageData(10,10,50,50);
    var canvasData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    //这个循环是取得图像的每一个点,在计算灰度后将灰度设置给原图像
    
    for (var x = 0; x < canvasData.width; x++) {
        //alert("x="+x);
        for (var y = 0; y < canvasData.height; y++) {
            //alert("y="+y);
            // Index of the pixel in the array
            var idx = (x + y * canvas.width) * 4;

            // The RGB values
            var r = canvasData.data[idx + 0];
            var g = canvasData.data[idx + 1];
            var b = canvasData.data[idx + 2];
            //更新图像数据
            var gray = CalculateGrayValue(r , g , b);
            canvasData.data[idx + 0] = gray;
            canvasData.data[idx + 1] = gray;
            canvasData.data[idx + 2] = gray;
        }
    }
      ctx.putImageData(canvasData, 0, 0);
    }
  
  //计算图像的灰度值,公式为:Gray = R*0.299 + G*0.587 + B*0.114
  function CalculateGrayValue(rValue,gValue,bValue){
     return parseInt(rValue * 0.299 + gValue * 0.587 + bValue * 0.114);
  }
  
</script>

<!-- demo3: 二值化--> 
<script type="text/javascript">
  //一维OTSU图像处理算法
 function OTSUAlgorithm(){
   var m_pFstdHistogram = new Array();//表示灰度值的分布点概率
   var m_pFGrayAccu = new Array();//其中每一个值等于m_pFstdHistogram中从0到当前下标值的和
   var m_pFGrayAve = new Array();//其中每一值等于m_pFstdHistogram中从0到当前指定下标值*对应的下标之和
   var m_pAverage=0;//值为m_pFstdHistogram【256】中每一点的分布概率*当前下标之和
   var m_pHistogram = new Array();//灰度直方图
   var i,j;
   var temp=0,fMax=0;//定义一个临时变量和一个最大类间方差的值
   var nThresh = 0;//最优阀值
   //获取灰度图像的信息
   var imageInfo = GetGrayImageInfo();
   if(imageInfo == null){
     window.alert("图像还没有转化为灰度图像!");
     return;
   }
   //初始化各项参数
   for(i=0; i<256; i++){
     m_pFstdHistogram[i] = 0;
     m_pFGrayAccu[i] = 0;
     m_pFGrayAve[i] = 0;
     m_pHistogram[i] = 0;
   }
   //获取图像信息
   var canvasData = imageInfo[0];
   //获取图像的像素
   var pixels = canvasData.data;
   //下面统计图像的灰度分布信息
   for(i=0; i<pixels.length; i+=4){
      //获取r的像素值,因为灰度图像,r=g=b,所以取第一个即可
      var r = pixels[i];
      m_pHistogram[r]++;
   }
   //下面计算每一个灰度点在图像中出现的概率
   var size = canvasData.width * canvasData.height;
   for(i=0; i<256; i++){
      m_pFstdHistogram[i] = m_pHistogram[i] / size;
   }
   //下面开始计算m_pFGrayAccu和m_pFGrayAve和m_pAverage的值
   for(i=0; i<256; i++){
      for(j=0; j<=i; j++){
        //计算m_pFGaryAccu[256]
    m_pFGrayAccu[i] += m_pFstdHistogram[j];
    //计算m_pFGrayAve[256]
    m_pFGrayAve[i] += j * m_pFstdHistogram[j];
      }
      //计算平均值
    m_pAverage += i * m_pFstdHistogram[i];
   }
   //下面开始就算OSTU的值,从0-255个值中分别计算ostu并寻找出最大值作为分割阀值
   for (i = 0 ; i < 256 ; i++){
    temp = (m_pAverage * m_pFGrayAccu[i] - m_pFGrayAve[i]) 
         * (m_pAverage * m_pFGrayAccu[i] - m_pFGrayAve[i]) 
         / (m_pFGrayAccu[i] * (1 - m_pFGrayAccu[i]));
    if (temp > fMax)
    {
      fMax = temp;
      nThresh = i;
    }
  }
   //下面执行二值化过程 
   for(i=0; i<canvasData.width; i++){
      for(j=0; j<canvasData.height; j++){
         //取得每一点的位置
         var ids = (i + j*canvasData.width)*4;
         //取得像素的R分量的值
         var r = canvasData.data[ids];
         //与阀值进行比较,如果小于阀值,那么将改点置为0,否则置为255
         var gray = r>nThresh?255:0;
         canvasData.data[ids+0] = gray;
         canvasData.data[ids+1] = gray;
         canvasData.data[ids+2] = gray;
      }
   }
   //显示二值化图像
   var newImage = document.getElementById('myCanvas').getContext('2d');
   newImage.putImageData(canvasData,0,0);
 }  
 
 //获取图像的灰度图像的信息
 function GetGrayImageInfo(){
    var canvas = document.getElementById('myCanvas');
  var ctx = canvas.getContext('2d');
  var canvasData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  if(canvasData.data.length==0){
    return null;
  }
  return [canvasData,ctx];
 }
 //下面对灰度图像进行处理,将目标信息分割出来
 function DividedTarget(){
   //读取二值化图像信息
   var imageInfo = document.getElementById('myCanvasThreshold');
   if(imageInfo == null){
     window.alert("没有发现二值化图像信息!");
     return;
   }
   //取得上下文
   var ctx = imageInfo.getContext('2d');
   //获取图像数据
   var canvasData = imageInfo.getImageData(0, 0, ctx.width, ctx.height);
   var newVanvasData = canvasData;
   //取得图像的宽和高
   var width = canvasData.width;
   var height = canvasData.height;
   //算法开始
   var cursor = 2;
   for(var x=0; x<width; x++){
      for(var y=0; y<height; y++){
         //取得每一点的位置
         var ids = (x + y*canvasData.width)*4;
         //取得像素的R分量的值
         var r = canvasData.data[ids];
         //如果是目标点
         if(r==0){
            
         }
      }
   }
   
 }
</script>


</html>
验证码识别技术:从传统图像处理到深度学习 验证码识别是计算机视觉领域的重要应用,其核心在于解决人机交互中的自动化挑战。传统方法基于OpenCV的图像处理技术,通过灰度化、二值化、降噪等步骤提取特征,结合OCR工具实现识别。随着深度学习的发展,卷积神经网络(CNN)显著提升了复杂验证码的识别准确率。在工程实践中,验证码识别技术广泛应用于爬虫系统、自动化测试等场景,其中图像预处理和模型优化是关键环节。针对滑块验证码、文字验证码等不同类型,需要采用特定的处理策略。通过合理的数据增强和模型设计,可以构建高精度的识别系统,但需注意遵守相关法律法规。 阅读详情

相关推荐

ZXing实战:如何用Java后端高效解析模糊二维码(含Base64处理技巧)

本文针对H5、UniApp等前端方案在复杂环境下识别模糊二维码的瓶颈,提出并详解了基于Java后端与ZXing库的高效解码方案。文章重点阐述了如何通过Base64数据清洗、图像预处理、多重解码策略(如HybridBinarizer与GlobalHistogramBinarizer切换)以及工程化封装,大幅提升对油污、磨损、反光等“问题”二维码的识别成功率与鲁棒性。

weixin_29210727的博客 45

javascript 图像二值化处理

代码 &lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;title&gt;&lt;/title&gt; &lt;/head&gt; &lt;body onload="showImg()"&gt; &lt;canvas id="canvas&q

qq506930427的博客 5420

基于PyTorch的手写数字识别工程:从模型训练到GUI打包全流程

手写数字识别是深度学习入门最经典的实战场景之一,它涵盖从图像预处理、卷积神经网络建模到模型推理部署的完整链路。在实际工程中,MNIST数据集是训练和评估的基准,而构建一个可交互的识别系统则需要将Python生态中的PyTorch、OpenCV、Pillow与Tkinter图形界面有机结合。图像预处理是影响识别精度的关键环节,包括灰度化、二值化、尺寸归一化等操作,直接决定了模型对真实手写输入的适应能力。借助卷积神经网络的局部特征提取能力,系统能够快速给出高置信度的分类结果。进一步地,通过PyInstaller

weixin_29055137的博客 244

fabricjs 实现图像的二值化功能

二值化是图像处理中常用的一种方法,其作用是将灰度图像转换为二值图像,即将图像中的像素点根据其灰度值分成两类:黑色和白色。这种处理方法可以帮助我们更清晰地识别图像中的目标,简化图像的复杂度,提高图像的处理速度和准确性。页面中要有3个canvas,grayCanvas 画灰度图片,binaryCanvas画二值化图片,hiddenCanvas 画原始的图片便于截图。转化为灰度图片,放在灰度画布中。

weixin_40466351的博客 1240

西瓜答题工具:OCR技术应用与智能答案搜索

htmltable {th, td {th {pre {简介:在线答题游戏在互联网上广受欢迎,而OCR技术的应用使得“西瓜答题工具”能够实时识别题目并快速搜索答案,同时计算选项权重提供科学答题策略。该工具结合图像处理算法、搜索引擎和大数据分析技术,大幅提升了答题效率和正确率。它还具备智能优化功能,根据用户习惯不断调整搜索策略和权重计算,使其成为一款高效智能的答题辅助应用。使用时,用户应结合自身学习和思考,平衡娱乐与知识积累。

weixin_42608318的博客 727

OpenCV+Python停车场空位识别实战包:含训练模型car1.h5与30张实拍车位图

直接可用的车位检测代码包,用OpenCV做图像预处理、车位框定位和空/占状态判别,核心模型car1.h5已训练完成,加载即推理。配套30张真实停车场图片,覆盖早晚光照变化、斜拍俯拍角度、平行/垂直/倾斜车位布局(如scene1410.jpg、spot194.jpg、spot286.jpg等),全部为静态单帧图,不依赖视频流。代码结构清晰,关键步骤带中文注释,兼容Python 3.7–3.11及OpenCV 4.x,支持在本地电脑或树莓派类边缘设备快速运行验证。适合想动手理解停车场景下图像二值化、轮廓分析、R

coffee的博客 235

HTML5 Canvas ( 图形的像素操作 ) getImageData, putImageData, ImgData.data

&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;canvas&lt;/title&gt; &lt;script type="text/javascript" src="../js/jQuery.js&

weixin_33705053的博客 295

基于Python的手写数学算式识别:从图像处理到安全计算的完整实现

光学字符识别(OCR)是计算机视觉领域的基础技术,它使计算机能够从图像中提取和理解文本信息。其核心原理在于通过图像预处理、特征提取和模式识别,将像素矩阵转换为可编辑的字符序列。这项技术的价值在于极大地提升了信息数字化的效率,广泛应用于文档自动化、智能表单处理和辅助学习等场景。在特定垂直领域,如教育科技,针对手写数学算式的识别需求日益增长,它要求系统不仅能识别字符,还需理解数学结构并安全计算。本文聚焦于实现一个轻量级、可解释的流水线系统,通过OpenCV进行图像预处理与字符分割,利用卷积神经网络(CNN)进行

weixin_29053577的博客 250

图片的灰度化与二值化

为了提高Tesseract识别的准确性,需要对图片进行一些处理。 灰度化 RGB颜色模型 一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光,且三原色的红绿蓝不可能用其他单色光合成。 RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值。RGB图像仅仅使用三种颜色,R(red)、G(gre...

爱你の大表哥的博客 1万+

JS利用OTSU二值化并缩小选定区域

js利用大津阈值算法将图像二值化,再将多于背景裁去,实现精确定位区域内有效内容区。 OTSU大津阈值算法,是存js写的算法,是将图片二值化的常见算法之一。 图像处理用canvas,不太熟悉canvas的操作的同学,可以拿来做练习使用。

08-SD卡-TF卡硬件电路设计

SD卡-TF卡硬件电路设计

weixin_66510961的博客 8262

OpenCV中的灰度化/二值化/canny

中央电视台,中央电视台,欢迎大家来到今日份opencv效果展示,下面介绍一下参赛选手,我家著名选狗,咩咩狗,今天大家看看咩咩的几幅不同的面孔。 来给大家叫两声,汪,汪 1.灰度化 直接上代码,默认大家都会读图 import cv2 path = r'./miemie4.jpg' ori_image = cv2.imread(path) cv2.imshow('ori_imag...

guligedong的博客 2833

从仿真到部署:基于ROS2与Gazebo的UR5e机械臂全流程控制实践

本文详细介绍了基于ROS2与Gazebo的UR5e机械臂全流程控制实践,从环境准备、模型构建到控制器开发和仿真优化,最终实现真实机器人部署。通过实战案例和避坑指南,帮助开发者掌握机器人仿真与控制的关键技术,提升UR5e机械臂在物料分拣等任务中的性能与稳定性。

weixin_29184371的博客 288

数字图像处理(12):灰度二值化

灰度像素、灰度处理、灰度二值化

2301_80417284的博客 1072

conda环境的复制、备份操作

请确保将 source_env 替换为你要复制的现有环境的名称,并将 target_env 替换为你要创建的新环境的名称。要备份一个Conda虚拟环境,你需要将环境的配置信息和依赖包列表保存起来,以便在需要的时候能够重新创建相同的环境。要将现有的 conda 环境复制为其他环境,可以使用 conda create 命令并克隆已存在的环境。

Dollhan的博客 3773

5分钟搞定SNMP工具安装:从Linux到Windows的snmpwalk/snmpget全攻略

本文提供了SNMP工具(snmpwalk/snmpget)在Linux和Windows系统上的快速安装与使用指南,涵盖从基础安装到高阶应用的全面解析。通过详细的命令示例和故障排查技巧,帮助用户快速掌握网络设备监控与诊断的核心技能,提升运维效率。

weixin_29248313的博客 557

html5图像、图片处理【转】

本文主题       情人节在网上看到国外JS牛人利用HTML5技术实现的一朵玫瑰花,深切的感受到HTML5技术的强大。本着学习的态度看了一下那朵玫瑰花的源代码,其中用到的HTML5技术是canvas标签,于是灵光一现,想试一下能不能进行图像处理,结果成功了,再次介绍一下经验。       本文的思路是获取一张带有验证码的图片,然后对其进行灰度化操作,完成后对其使用Otsu算法进行二值化操作,...

weixin_34246551的博客 469

1小时读完100篇文献的正确打开方式

各位同仁好,我是七哥。一个在高校里从事人工智能 相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude 等大模型 学术实操相关问题,多多交流,相互成就,共同进步。文献阅读与整理一般都是最先开始、却也最容易被低估的一步。很多学术同仁一开始就陷入越读越多、越读越乱的状态:论文下载了一大堆,但真正能用来支撑自己观点的内容却始终难以提炼出来。一方面,我们需要通过文献了解该研究领域的整体发展脉络,把握当前学界已经讨论到什么程度;

智能AI让学术科研更容易 49

识别快递单号(2) - 加载图片到canvas

传送门:识别快递单号(1) - 图像处理 转载请注明出处:http://www.cnblogs.com/zaiyuzhong/p/load-image-to-canvas.html 上篇说到我突然想到了一个问题: 这些代码究竟运行在什么位置, 手机端还是服务器? 又如何获取图片?  1. 手机端: 现在的浏览器还不支持javascript调用后置摄像头(Chrome可以调用前置摄像头),...

weixin_30522183的博客 436

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

statistics+insight+vista+power 280

Vibe Writing 手把手教程:Obsidian + Claudian + Skill

本文介绍了Vibe Writing的实操教程,主要使用Obsidian+Claudian+Skill组合。教程包含工具安装配置(Obsidian、Claudian插件)、核心工作流(选题-调研-写作-发布)和效果对比。重点展示了Claude Code生成的文本更具"人味"和场景感,优于其他AI工具。作者强调工具只是辅助,内容灵魂仍需个人思考积累。附有公众号排版和全网发布工具推荐,以及自动配图生成方案。

302

【图像计数】基于matlab GUI图像处理颗粒自动计数【含Matlab源码 15231期】

图像处理颗粒自动计数 完整代码,包运行;可提供讲解和运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 466

LiveBOS UploadFile.do 任意文件上传漏洞复现(XVE-2023-21708)

LiveBOS UploadFile.do 接口存在任意文件上传漏洞,未经身份验证的攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。

0xSec 2426

matlab 图像连通域,matlab二值图像连通域

这就是说bwlabel是用来标记二维的二值图像中的connected components的,简言之,就是黑背景下面有多少白的块(连通组件?真别扭),反正就是从黑背景甄别白块块的。就......8.1 图像分割定义 8.2 使用阈值进行图像分割 8.3基于梯度的图像分割方法 8.4 边缘检测和连接 Contents Contents 8.5 区域增长(Region Growing) 8.6 二值图...

weixin_39647734的博客 1846

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

提高文档档案管理的办公效率的神器---云脉H5文档管理

在数字时代,OCR技术的成熟和应用给企业带来了巨大的效益。它不仅能为企业提供高效的办公效率,而且能使无序的纸张变得有序。在海量数据的管理中,方便企业快速检索、搜索和上传数据。 依托OCR识别技术,厦门云脉推出云脉H5文档管理,随时随地轻松管理您的文档。它还支持简体和繁体中文、英语和其他语言。字符识别率大于98%,平均识别时间小于2秒。它能有效准确地识别纸质文档信息,快速录入文本信息,减少人工工作量。它不仅适用于办公室工作,也适用于学习资料的收集。它的突出优点是支持手写识别。比如,当灵感突然来写一..

thanghan20的博客 191

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

下一篇: Electron-跨平台桌面开发
Machine4869
博客等级 码龄10年 9粉丝 14原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值