news 2026/5/10 13:42:42

用之前的轮变换高效去除画面模糊,处理画面失真的情况,但是因为是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;margin:10px;}

button:hover {background:#45a049;}

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

.slider {margin:15px auto;width:400px;}

</style>

</head>

<body>

<div class="container">

<h3>初始模糊图(模糊程度可调)</h3>

<input type="range" min="1" max="10" value="3" class="slider" id="blurSlider">

<span id="blurValue">模糊程度:3</span>

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

<h3>最终去模糊结果图</h3>

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

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

<button onclick="startProcess()">开始轮廓融合+卷积去模糊</button>

</div>

<script>

let blurCtx = blurCanvas.getContext('2d'), resCtx = resultCanvas.getContext('2d');

let blurSlider = document.getElementById('blurSlider');

let blurValue = document.getElementById('blurValue');

let originalImgData, blurLevel = 3;

let hiddenFrames = [];

blurSlider.oninput = function() {

blurLevel = parseInt(this.value);

blurValue.textContent = `模糊程度:${blurLevel}`;

drawRandomGraph();

generateBlurFrames();

};

// 原有核心:生成图形

function drawRandomGraph() {

blurCtx.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;

blurCtx.beginPath();

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

blurCtx.closePath();

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

blurCtx.fill();

}

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

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

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

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

blurCtx.fill();

}

originalImgData = blurCtx.getImageData(0,0,400,300);

}

// 新增:生成隐式模糊帧

function generateBlurFrames() {

hiddenFrames = [];

let w = 400, h = 300;

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

let tempCtx = document.createElement('canvas').getContext('2d');

tempCtx.canvas.width = w;

tempCtx.canvas.height = h;

tempCtx.putImageData(originalImgData, 0, 0);

tempCtx.filter = `blur(${blurLevel}px)`;

tempCtx.drawImage(tempCtx.canvas, f*2, f*1, w, h, 0, 0, w, h);

hiddenFrames.push(tempCtx.getImageData(0,0,w,h));

}

blurCtx.filter = `blur(${blurLevel}px)`;

blurCtx.drawImage(blurCtx.canvas, 0, 0, w, h, 0, 0, w, h);

blurCtx.filter = 'none';

}

// 原有核心:提取轮廓 → 新增边缘淡化

function extractOutline(imgData) {

let w = imgData.width, h = imgData.height;

let outlineData = new ImageData(w, h);

let data = imgData.data, outData = outlineData.data;

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;

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;

}

}

// 边缘颜色淡化:降低轮廓亮度,避免边缘过亮

outData[i] = isEdge ? 180 : 0;

outData[i+1] = isEdge ? 180 : 0;

outData[i+2] = isEdge ? 180 : 0;

outData[i+3] = isEdge ? 120 : 0; // 降低透明度进一步淡化

}

}

return outlineData;

}

// 加权融合

function weightFusion(imgData, outlineData, alpha = 0.7) {

let w = imgData.width, h = imgData.height;

let fusedData = new ImageData(w, h);

let d1 = imgData.data, d2 = outlineData.data, d3 = fusedData.data;

for(let i=0;i<d1.length;i+=4){

d3[i] = Math.round(d1[i] * alpha + d2[i] * (1 - alpha));

d3[i+1] = Math.round(d1[i+1] * alpha + d2[i+1] * (1 - alpha));

d3[i+2] = Math.round(d1[i+2] * alpha + d2[i+2] * (1 - alpha));

d3[i+3] = 255;

}

return fusedData;

}

// 局部卷积

function localConvolution(fusedData, frames) {

let w = fusedData.width, h = fusedData.height;

let convData = new ImageData(w, h);

let d = fusedData.data, cd = convData.data;

let kernel = [1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9];

let allFrames = [fusedData, ...frames];

for(let y=1;y<h-1;y++){

for(let x=1;x<w-1;x++){

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

let r = 0, g = 0, b = 0;

for(let dy=-1;dy<=1;dy++){

for(let dx=-1;dx<=1;dx++){

let idx = ((y+dy)*w + (x+dx))*4;

let k = (dy+1)*3 + (dx+1);

for(let f=0;f<allFrames.length;f++){

let fd = allFrames[f].data;

r += fd[idx] * kernel[k] / allFrames.length;

g += fd[idx+1] * kernel[k] / allFrames.length;

b += fd[idx+2] * kernel[k] / allFrames.length;

}

}

}

cd[i] = Math.round(r);

cd[i+1] = Math.round(g);

cd[i+2] = Math.round(b);

cd[i+3] = 255;

}

}

return convData;

}

// 新增:多轮原图叠加函数

function overlayOriginal(targetData, originalData, times = 3, alpha = 0.2) {

let d1 = targetData.data, d2 = originalData.data;

for(let t=0; t<times; t++){

for(let i=0; i<d1.length; i+=4){

d1[i] = Math.round(d1[i] * (1 - alpha) + d2[i] * alpha);

d1[i+1] = Math.round(d1[i+1] * (1 - alpha) + d2[i+1] * alpha);

d1[i+2] = Math.round(d1[i+2] * (1 - alpha) + d2[i+2] * alpha);

}

}

return targetData;

}

// 核心流程:新增 多轮原图叠加

function startProcess() {

let currentData = hiddenFrames[0];

// 多轮轮廓融合

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

let outline = extractOutline(currentData);

currentData = weightFusion(currentData, outline);

}

// 卷积去模糊

let convData = localConvolution(currentData, hiddenFrames.slice(1));

// 关键修改:多轮与原图叠加,还原细节+淡化边缘

let finalData = overlayOriginal(convData, originalImgData, 4, 0.15);

resCtx.putImageData(finalData, 0, 0);

}

function reset() {

drawRandomGraph();

generateBlurFrames();

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

}

window.onload = function() {

drawRandomGraph();

generateBlurFrames();

};

</script>

</body>

</html>

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

11、僵尸网络检测:工具与技术全解析

僵尸网络检测:工具与技术全解析 在当今数字化时代,网络安全问题日益严峻,僵尸网络作为其中一种极具威胁性的存在,给企业和个人带来了巨大的风险。本文将深入探讨僵尸网络检测的相关工具和技术,帮助你更好地了解和应对这一挑战。 1. 代码信任与Tripwire的应用 在软件开发…

作者头像 李华
网站建设 2026/5/1 7:25:37

15、深入解析IRC与僵尸网络检测

深入解析IRC与僵尸网络检测 1. 引言 在网络安全领域,检测僵尸网络客户端和服务器网络是一项关键任务。同时,识别那些可能托管与IRC相关黑客频道的受感染主机也至关重要。在探讨僵尸网络客户端和服务器之前,我们需要先了解IRC协议本身,并简要了解相关的统计信息,这有助于…

作者头像 李华
网站建设 2026/5/4 23:43:37

超级核酸酶残留ELISA检测试剂盒

超级核酸酶残留ELISA检测试剂盒 【双夹心酶联免疫定量法】 产品货号&#xff1a;EKT0003 &#xff08;实验前请仔细阅读产品说明书&#xff09; 声明&#xff1a;尊敬的客户&#xff0c;感谢您选用本公司的产品。本试剂盒仅供体外研究使用、不用于临床诊断!本试剂盒不含任何…

作者头像 李华
网站建设 2026/5/1 12:17:25

27、网络监控与审计实践指南

网络监控与审计实践指南 在当今数字化时代,网络安全至关重要。监控和审计网络活动能够帮助我们及时发现潜在的安全威胁,保障系统的稳定运行。本文将介绍一些常见的网络监控和审计工具及其实践操作,通过实际的实验步骤和相关问题解答,帮助大家更好地理解和掌握这些知识。 …

作者头像 李华
网站建设 2026/5/5 8:09:43

【金猿产品展】智慧芽 Eureka——更懂技术创新的AI Agent平台

智慧芽产品该产品由智慧芽投递并参与金猿组委会数据猿上海大数据联盟共同推出的《2025中国大数据产业年度创新服务产品——十年标杆产品》榜单/奖项评选。大数据产业创新服务媒体——聚焦数据 改变商业随着AI技术的突飞猛进&#xff0c;通用大模型开始进入各行各业。然而&…

作者头像 李华
网站建设 2026/5/1 15:02:48

Kotaemon中的索引构建速度影响因素分析

Kotaemon中的索引构建速度影响因素分析 在企业级智能问答系统日益普及的今天&#xff0c;一个常被低估但至关重要的环节正悄然决定着系统的敏捷性与可维护性——知识索引的构建速度。对于采用检索增强生成&#xff08;RAG&#xff09;架构的系统而言&#xff0c;即使拥有最先进…

作者头像 李华