news 2026/6/23 10:45:47

一种基于旋转二值轮矩阵的(边缘提取算法),能够大致保留原本图形信息(包括颜色),同时计算速度很快,因为是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/6/23 17:36:46

0x3f第七天 二叉搜索树

1.前序遍历&#xff1a;4213657先验证根是否满足大于左子树最大值&#xff0c;小于右子树最小值遍历左子树&#xff08;更新右值&#xff09;遍历右子树&#xff08;更新左值&#xff09;对于最大值和最小值&#xff0c;可以直接在函数里加上def isValidBST(self, root: Option…

作者头像 李华
网站建设 2026/6/23 15:14:03

扩容U盘,资料毁灭盘

早就听过扩容盘了&#xff0c;没想到也发生在我身上。原本上面是印着长城的 &#xff0c;但现在掉漆了。店铺现在这个商品下架了&#xff0c;但店铺是有品牌认证的这个U盘也算是用了将近4年了&#xff0c;存的都是大学的上课的作业。大四没课回家了几个月没有使用过这个U盘&…

作者头像 李华
网站建设 2026/6/23 3:18:20

数据结构学习篇(5)---顺序表和链表的区别

对于顺序表和链表的异同&#xff0c;上面这个表格直观展示了两者的不同之处&#xff0c;有几点可以做一下解释&#xff1a;顺序表和链表在逻辑结构上都是连续的&#xff0c;但是在物理结构&#xff0c;也就是存储空间上&#xff0c;顺序表是连续的&#xff0c;因为他的本质是数…

作者头像 李华
网站建设 2026/6/23 8:57:52

【Matlab】代码库:RGB三通道图像←互转→RGB次序平铺二维

本文介绍了两种MATLAB图像转换方法&#xff1a;1) 将3D RGB图像转换为2D平铺格式&#xff0c;通过向量化操作将RGB通道展开为连续列&#xff0c;并将8位数据扩展到12位&#xff1b;2) 将2D平铺图像还原为3D RGB格式&#xff0c;通过反向操作分离通道并压缩回8位。两种方法均提供…

作者头像 李华