当前位置: 首页 > news >正文

OpencvSharp 算子学习教案之 - Cv2.BlendLinear

OpencvSharp 算子学习教案之 - Cv2.BlendLinear

大家好,Opencv在很多工程项目中都会用到,而OpencvSharp则是以C#开发与实现的Opencv操作库,对.NET开发人员友好,但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳,因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案,供大家参考学习。

Cv2.BlendLinear

  • 教案版本:V1.0
  • 面向对象:OpenCvSharp 初学者
  • 所属模块:imgproc
  • 源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs:2414

摘要:Cv2.BlendLinear会按照两张同尺寸图像的逐像素权重做线性融合。它最适合讲清楚“每个像素都可以有自己的混合比例”这一点,也很适合做渐变过渡、遮罩融合和拼接缝平滑处理。

1. 函数名称(带参数签名)

publicstaticvoidBlendLinear(InputArraysrc1,InputArraysrc2,InputArrayweights1,InputArrayweights2,OutputArraydst)

2. 函数用途

Cv2.BlendLinear用来把两张同尺寸、同类型的图像按像素权重融合成一张新图。

它和AddWeighted的区别在于:

  1. AddWeighted通常使用两个常量权重。
  2. BlendLinear使用的是两张权重图,所以每个像素都能有自己的混合比例。
  3. 当你想在图像左边更偏向图 A、右边更偏向图 B 时,这个函数非常合适。
  4. 它也常被用于图像拼接、遮罩过渡和局部混合。

3. 函数公式

对任意一个像素位置p pp,BlendLinear 的核心关系可以写成:

d s t ( p ) = w e i g h t s 1 ( p ) ⋅ s r c 1 ( p ) + w e i g h t s 2 ( p ) ⋅ s r c 2 ( p ) dst(p) = weights1(p) \cdot src1(p) + weights2(p) \cdot src2(p)dst(p)=weights1(p)src1(p)+weights2(p)src2(p)

如果你希望结果看起来“自然过渡”,通常会让:

w e i g h t s 1 ( p ) + w e i g h t s 2 ( p ) = 1 weights1(p) + weights2(p) = 1weights1(p)+weights2(p)=1

这样输出就相当于两张图按比例做线性插值。若权重和不等于 1,输出就可能整体变亮或变暗。

4. 函数原理说明

这个函数的工作方式可以分成四步理解:

  1. 先检查两张输入图是否同尺寸、同类型。
  2. 再检查两张权重图是否和输入图同尺寸。
  3. 对每个像素点,分别取出src1src2weights1weights2的值。
  4. 按照线性组合公式计算输出。

对初学者来说,最重要的是区分“常量权重”和“权重图”:

  1. 常量权重只会影响整张图。
  2. 权重图会让图像在不同位置呈现不同的融合比例。
  3. 如果两张权重图做成互补关系,过渡区域会非常平滑。

5. 参数含义解析

参数名类型必填含义
src1InputArray第一张输入图像
src2InputArray第二张输入图像
weights1InputArray第一张权重图,类型必须是CV_32FC1
weights2InputArray第二张权重图,类型必须是CV_32FC1
dstOutputArray输出图像

补充说明:

  1. src1src2必须尺寸相同,类型也要相同。
  2. weights1weights2必须和源图尺寸一致。
  3. 权重图必须是单通道浮点数图像,最常用的是CV_32FC1
  4. 输出图像会沿用源图的数据类型和通道数。

6. 应用场景列表

场景名场景说明典型用途
场景A:渐变过渡让左边更偏向第一张图,右边更偏向第二张图渐变融合、图像过渡
场景B:拼接缝平滑在两张图重叠区域使用不同权重全景拼接、缝合线隐藏
场景C:局部叠加只在局部区域让某张图权重更高目标叠加、局部增强
场景D:教学演示把权重图本身可视化,帮助初学者理解公式算法教学、调试验证

7. 函数使用示例(与 WPF 场景一一对应)

说明:下面代码对应 WPF 示例里的“BlendLinear”场景。为了让初学者更容易理解,这里用两张简单的彩色卡片和一张水平渐变权重图来演示。

usingSystem;usingOpenCvSharp;internalstaticclassProgram{privatestaticvoidMain(){// 先构造两张同尺寸彩色图,第一张偏暖色,第二张偏冷色。usingvarsrc1=CreateWarmCard();usingvarsrc2=CreateCoolCard();// 这两张权重图都必须是 CV_32FC1,并且尺寸要和源图一致。usingvarweights1=CreateHorizontalWeights(src1.Size(),inverse:true);usingvarweights2=CreateHorizontalWeights(src2.Size(),inverse:false);// 输出图像由 BlendLinear 生成。usingvarblended=newMat();Cv2.BlendLinear(src1,src2,weights1,weights2,blended);// 把结果保存到磁盘,方便和原图对照观察。Cv2.ImWrite("blendlinear_src1.png",src1);Cv2.ImWrite("blendlinear_src2.png",src2);Cv2.ImWrite("blendlinear_weights.png",CreateHeatmapPreview(weights2));Cv2.ImWrite("blendlinear_blended.png",blended);Console.WriteLine("BlendLinear 演示已完成。");}privatestaticMatCreateWarmCard(){// 创建一张暖色背景图,便于观察融合后的变化。varcanvas=newMat(240,360,MatType.CV_8UC3,newScalar(236,238,248));// 叠加几个简单图形,让图像里有明显的颜色区域。Cv2.Rectangle(canvas,newRect(20,28,110,82),newScalar(46,150,240),-1,LineTypes.AntiAlias);Cv2.Circle(canvas,newPoint(198,88),48,newScalar(74,182,96),-1,LineTypes.AntiAlias);Cv2.Ellipse(canvas,newPoint(266,170),newSize(64,40),-15,0,360,newScalar(62,92,216),-1,LineTypes.AntiAlias);Cv2.PutText(canvas,"Warm",newPoint(30,214),HersheyFonts.HersheySimplex,0.9,newScalar(40,40,40),2,LineTypes.AntiAlias);returncanvas;}privatestaticMatCreateCoolCard(){// 创建一张冷色背景图,和第一张图形成鲜明对比。varcanvas=newMat(240,360,MatType.CV_8UC3,newScalar(246,242,236));Cv2.Rectangle(canvas,newRect(24,34,108,76),newScalar(232,120,88),-1,LineTypes.AntiAlias);Cv2.Circle(canvas,newPoint(202,92),50,newScalar(86,210,188),-1,LineTypes.AntiAlias);Cv2.Ellipse(canvas,newPoint(266,176),newSize(64,40),18,0,360,newScalar(142,92,238),-1,LineTypes.AntiAlias);Cv2.PutText(canvas,"Cool",newPoint(270,214),HersheyFonts.HersheySimplex,0.9,newScalar(40,40,40),2,LineTypes.AntiAlias);returncanvas;}privatestaticMatCreateHorizontalWeights(Sizesize,boolinverse){// 创建一张从左到右变化的浮点权重图。varweights=newMat(size.Height,size.Width,MatType.CV_32FC1);for(varrow=0;row<size.Height;row++){for(varcol=0;col<size.Width;col++){varalpha=col/(float)(size.Width-1);weights.At<float>(row,col)=inverse?1f-alpha:alpha;}}returnweights;}privatestaticMatCreateHeatmapPreview(Matsource){// 先把浮点权重图规范化到 0~255,再用热力图显示出来。usingvarnormalized=newMat();source.ConvertTo(normalized,MatType.CV_8UC1,255.0);varpreview=newMat();Cv2.ApplyColorMap(normalized,preview,ColormapTypes.Turbo);returnpreview;}}

8. 常见错误与避坑

  1. weights1weights2不是CV_32FC1,会导致运行时异常。
  2. 两张输入图尺寸不同,函数无法直接处理。
  3. 权重图尺寸和输入图不一致,也会失败。
  4. 权重和不接近 1 时,结果可能整体偏亮或偏暗。
  5. 把整数矩阵当作权重图使用,会让比例计算失去精度。

9. 进阶扩展

  1. 可以用线性渐变权重图做“左右平滑过渡”的拼接缝。
  2. 可以把权重图换成从分割结果生成的 mask,实现更智能的融合。
  3. 可以先对权重图做模糊处理,再融合,进一步减弱边界。
  4. 可以把同样的思路扩展到多张图,逐步完成全景拼接或区域混合。

10. 小结

Cv2.BlendLinear的本质是“逐像素线性插值”。只要记住三点就够了:

  1. 两张源图必须同尺寸、同类型。
  2. 两张权重图必须是CV_32FC1,并且和源图同尺寸。
  3. 如果希望结果自然,通常让两个权重互补,也就是一高一低、总和接近 1。

11. 相关链接

  • WPF 教学控件:Cv2BlendLinearControl.xaml.cs
  • 样例实现:BlendLinearSample.cs
  • 官方文档源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs:2414
http://www.zskr.cn/news/1429870.html

相关文章:

  • 终极指南:如何用猫抓Cat-Catch轻松下载网页视频和流媒体资源
  • 告别虚拟机!在老旧Dell/HP服务器上实战安装CentOS 7.9全记录
  • 重庆本润装饰真实业主评价合集,口碑见证 - 大渝测评
  • 三步掌握CoreCycler:CPU单核心稳定性测试终极指南
  • Qoder使用二:内置智能体
  • 智谱AI完成5亿美元融资 + AutoGLM 2.0发布:对标GPT-5 Agent Mode
  • Selenium自动化测试:除了放Scripts目录,ChromeDriver还有这3种灵活配置方法
  • [智能体-128]:智能体,模型与工具的整合者
  • DeepSeek V1
  • 用Java+SpringBoot给服务器告警邮件找个‘飞书管家’:保姆级配置教程(附避坑点)
  • Debian 11 Bullseye 新装后必做的 10 件事:从内核 5.10 到 LibreOffice 7.0 的实用调优
  • BioAge终极指南:5步掌握生物年龄计算与衰老评估的R语言工具包
  • 河北君宏泵业:排污泵/循环泵/隔膜泵/消防泵/混流泵专业制造与多场景应用 - 品牌推荐官
  • 端渲染与流渲染的融合之道:数字孪生应用开发套件的工程选型思路
  • YOLOv11地铁站台与候车室行李目标检测数据集-153张-suitcase-1_6
  • Windows Defender彻底移除终极指南:2025免费工具完整教程
  • 2026年郑州企业AI获客难?盘点5家GEO优化服务商特点 - 资讯快报
  • 多塔柱混凝土矮塔斜拉桥结构解析方案【附数据】
  • Transformer架构深度解析:从原理到实践的全面指南
  • 188、运动控制中的行业应用:电子装配与贴片机
  • NoFences:免费开源的Windows桌面分区神器终极指南
  • Rusted PackFile Manager:全面战争MOD开发的终极效率工具完整教程
  • IF=10.0!浙大博士一作再登柳叶刀子刊!
  • 2026年徐州甲级写字楼集中区揭秘,锁定这三大板块
  • Gemini产品需求文档标准模板(2024最新版V2.3·仅限头部AI团队内部流通)
  • Gemini财务分析报告深度拆解(2024版审计底稿首次公开)
  • 安徽工业无人机维修痛点难解?专业无人机维修培训方案认准乘云低空,无人机实操培训,无人机维修培训机构哪家强 - 品牌推荐师
  • YOLOv11古生物化石研究沙虎鲨牙齿目标检测数据集-280张-shark-teeth-1
  • GTWR与GWR模型怎么选?结合房价案例聊聊时空权重的实际影响
  • 如何快速搭建免费的个人天气API:Open-Meteo终极指南