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

【OpenCV C++20 学习笔记】给图片加边框-copyMakeBorder

给图片加边框

  • 原理
  • API
  • 实例

原理

在卷积的过程中,图片边缘的处理总是一个问题。因为卷积核的锚点无法覆盖图片的边缘像素,硬要覆盖的话,卷积核就会有一部分超出图片的范围。
OpenCV中的大部分方法都会将图片的边缘像素进行扩充,从而扩大原有的图片。这样卷积核就能覆盖原来的边缘像素了。
本文将介绍两种对图片边缘像素进行扩充的方法:

  • BORDER_CONSTANT:用一个常量(比如表示黑色的0)对图片边缘进行扩充
  • BORDER_REPLICATE:图片的边缘像素被复制,从而形成图片的边框

API

以上两种边缘扩充的方法都可以用copyMakeBorder()函数来实现,其函数原型如下:

void cv::copyMakeBorder(InputArray		src,				//输入图片OutputArray		dst,				//输出图片int				top,				//上边框宽度int				bottom,				//下边框宽度int				left,				//左边框宽度int				right,				//有边框宽度int				borderType,			//边框扩充类型const Scalar&	value = Scalar());	//如果扩充类型是BORDER_CONSTANT,这个参数用来指定常量

实例

这个例子分别用第一节讲的两种方法给图片扩充边框:

  • 上下边框的宽度为原图高度的5%,左右边框的宽度为原图宽度的5%;
  • 用常量扩充边框时,边框的颜色随机生成

完整代码如下:

#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>using namespace cv;int main() {Mat src{ imread("lena.jpg") };int top{ static_cast<int>(0.05 * src.rows) }, bottom{ top };	//初始化上下边框的宽度int left{ static_cast<int>(0.05 * src.cols) }, right{ left };	//初始化左右边框的宽度RNG rng{ 12345 };	//随机数生成器//常量边框Scalar value(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0, 255));	//生成随机的BGR颜色Mat const_border;copyMakeBorder(src,const_border,top,bottom,left,right,BORDER_CONSTANT,value);			//需要指定value参数//复制边框Mat rep_border;copyMakeBorder(src,rep_border,top,bottom,left,right,BORDER_REPLICATE);	//注意这里并没有value这个参数imshow("原图", src);imshow("常量边框", const_border);imshow("复制边框", rep_border);waitKey(0);
}

运行结果如下:
给图片加上边框

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flink开发语言使用java还是Scala合适
  • C#中的Hangfire和Quartz.NET 任务调度的区别
  • Android 13修改蓝牙默认名称
  • 【计算机网络】[第二章][自用]
  • vue动态规则
  • 萌新的Java入门日记18
  • C++编程:使用Nanomsg实现高效的文件和图片传输
  • 2-56 基于matlab的图像融合增强技术
  • Java 设计模式之桥接模式(Bridge Pattern)
  • 《嵌入式 - 嵌入式大杂烩》ARM Cortex-M寄存器详解
  • 嵌入式初学-C语言-十六
  • elasticsearch--RestClient操作索引库(java)
  • linux查询占用端口 杀死占用端口进程
  • 基于OpenCV+MFC的视频读取与对象跟踪平台
  • MathType7.4中文版本功能详解!你的数学公式编辑神器
  • 自己简单写的 事件订阅机制
  • chrome扩展demo1-小时钟
  • CSS相对定位
  • Docker: 容器互访的三种方式
  • exif信息对照
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript 基础知识 - 入门篇(一)
  • magento2项目上线注意事项
  • Python学习之路13-记分
  • Python学习之路16-使用API
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue数据传递--我有特殊的实现技巧
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 试着探索高并发下的系统架构面貌
  • 算法系列——算法入门之递归分而治之思想的实现
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 问题之ssh中Host key verification failed的解决
  • 详解移动APP与web APP的区别
  • 小而合理的前端理论:rscss和rsjs
  • elasticsearch-head插件安装
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #mysql 8.0 踩坑日记
  • #QT(串口助手-界面)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (10)ATF MMU转换表
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)ssm高校实验室 毕业设计 800008
  • (回溯) LeetCode 40. 组合总和II
  • (十八)三元表达式和列表解析
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)、python程序--模拟电脑鼠走迷宫
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • .NET Core 项目指定SDK版本
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET DevOps 接入指南 | 1. GitLab 安装