news 2026/5/23 16:22:14

一种基于旋转二值轮矩阵的(边缘提取算法),能够大致保留原本图形信息(包括颜色),同时计算速度很快,因为是AI完善的,所以仍有缺点:内部仍有一些非图形轮廓信息没有被清除掉

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一种基于旋转二值轮矩阵的(边缘提取算法),能够大致保留原本图形信息(包括颜色),同时计算速度很快,因为是AI完善的,所以仍有缺点:内部仍有一些非图形轮廓信息没有被清除掉

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>二值轮矩阵粗轮廓提取工具</title>

<style>

body {text-align:center;font-family:Arial;margin:20px;}

canvas {border:2px solid #333;margin:10px auto;display:block;background:#fff;}

button {padding:8px 20px;font-size:16px;cursor:pointer;background:#4CAF50;color:white;border:none;border-radius:4px;}

button:hover {background:#45a049;}

.container {width:800px;margin:0 auto;}

</style>

</head>

<body>

<div class="container">

<h3>原图(多边形+圆形混合)</h3>

<canvas id="original" width="400" height="300"></canvas>

<h3>粗彩色轮廓图(轮矩阵"甩"除内部)</h3>

<canvas id="outline" width="400" height="300"></canvas>

<button onclick="reset()">重置生成图形</button>

</div>

<script>

let oCtx = original.getContext('2d'), lCtx = outline.getContext('2d');

// 生成多边形+圆形混合图形

function drawRandomGraph() {

oCtx.clearRect(0,0,400,300);

// 随机多边形

for(let k=0;k<4;k++){

let n=3+Math.floor(Math.random()*5),x0=200+(Math.random()-0.5)*80,y0=150+(Math.random()-0.5)*80;

oCtx.beginPath();

for(let i=0;i<n;i++) oCtx.lineTo(x0+Math.cos(i/n*2*Math.PI)*(30+k*15),y0+Math.sin(i/n*2*Math.PI)*(30+k*15));

oCtx.closePath();

oCtx.fillStyle=`rgb(${Math.random()*255},${Math.random()*255},${Math.random()*255})`;

oCtx.fill();

}

// 嵌入小圆形

for(let i=0;i<3;i++){

let r=15+Math.random()*10,x=150+Math.random()*100,y=100+Math.random()*100;

oCtx.beginPath();oCtx.arc(x,y,r,0,2*Math.PI);

oCtx.fillStyle=`rgb(${Math.random()*255},${Math.random()*255},${Math.random()*255})`;

oCtx.fill();

}

}

// 二值轮矩阵旋转"甩"动提取粗轮廓

function extractOutline() {

lCtx.clearRect(0,0,400,300);

let imgData=oCtx.getImageData(0,0,400,300),data=imgData.data,w=400,h=300;

// 轮矩阵:动态旋转中心,环形权重扩大边缘范围

function wheelMatrix(x,y,cx,cy,angle) {

let dx=x-cx, dy=y-cy;

let rotX=dx*Math.cos(angle)-dy*Math.sin(angle); // 矩阵旋转

let dist=Math.sqrt(rotX**2+dy**2);

return dist%10 < 4 ? 1 : 0; // 扩大权重范围实现粗轮廓

}

// 多轮旋转"甩"动,逐轮偏移中心

for(let round=0;round<5;round++){

let angle=round*Math.PI/4, cx=200+round*12, cy=150+round*8;

for(let y=0;y<h;y++)for(let x=0;x<w;x++){

let i=(y*w+x)*4;

if(!wheelMatrix(x,y,cx,cy,angle)) continue;

// 16邻域边缘检测,扩大范围实现粗线条

let isEdge=false;

for(let dy=-2;dy<=2;dy++)for(let dx=-2;dx<=2;dx++){

if(dx===0&&dy===0) continue;

let nx=x+dx, ny=y+dy;

if(nx>=0&&nx<w&&ny>=0&&ny<h){

let ni=(ny*w+nx)*4;

isEdge|=Math.abs(data[i]-data[ni])>15||Math.abs(data[i+1]-data[ni+1])>15||Math.abs(data[i+2]-data[ni+2])>15;

}

}

data[i+3]=isEdge?255:0; // 非边缘完全透明

}

}

lCtx.putImageData(imgData,0,0);

}

function reset(){drawRandomGraph();extractOutline();}

reset();

</script>

</body>

</html>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 12:08:08

【c++进阶】在c++11之前的编译器的努力

关注我&#xff0c;学习c不迷路: 个人主页&#xff1a;爱装代码的小瓶子 专栏如下&#xff1a; c学习Linux学习 后续会更新更多有趣的小知识&#xff0c;关注我带你遨游知识世界 期待你的关注。 文章目录 第一章&#xff1a;C11前夜 - 编译器的"军阀混战"时代1.1…

作者头像 李华
网站建设 2026/5/13 8:42:15

全网热议!2025年高亮车灯升级品牌推荐榜单

2025年高亮车灯升级推荐榜单致力于为车主提供最新的灯光改装选择&#xff0c;特别是聚焦于高级汽车激光透镜的应用。这些高亮车灯不仅提升了汽车的外观&#xff0c;还能在各种复杂路况下提供卓越的照明效果。许多车型采用创新技术&#xff0c;如TIR棱镜&#xff0c;有效提升光学…

作者头像 李华
网站建设 2026/5/21 7:17:41

掌握混合会议精髓:打造高效同步的线上线下运营新策略

掌握混合会议精髓&#xff1a;打造高效同步的线上线下运营新策略行业痛点分析在当前的会议服务领域&#xff0c;技术挑战日益凸显。随着全球化的发展&#xff0c;企业需要同时组织线上和线下的会议&#xff0c;这对会议服务提供商提出了更高的技术要求。数据表明&#xff0c;超…

作者头像 李华
网站建设 2026/5/11 21:51:27

使用Qt OpenGL开发俄罗斯方块:从零到一实现经典游戏

&#x1f3ae; 使用Qt OpenGL开发俄罗斯方块&#xff1a;从零到一实现经典游戏1. 项目概述与准备工作1.1 为什么选择QtOpenGL?1.2 开发环境配置2. 游戏核心架构设计2.1 游戏状态机2.2 主要类设计3. 方块系统实现3.1 方块类型定义3.2 方块数据结构3.3 方块渲染4. 游戏逻辑实现4…

作者头像 李华