利用Opencv4.9为图像添加边框

2024-04-21 09:12
文章标签 图像 边框 opencv4.9

本文主要是介绍利用Opencv4.9为图像添加边框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 返回:OpenCV系列文章目录(持续更新中......)
上一篇利用OpenCV4.9制作自己的线性滤波器!
下一篇 :OpenCV系列文章目录(持续更新中......)

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 copyMakeBorder() 设置边框(图像的额外填充)。

理论

注意

下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。

  1. 在之前的教程中,我们学习了使用卷积对图像进行操作。自然而然地出现的一个问题是如何处理边界。如果被评估的点位于图像的边缘,我们如何对它们进行卷积?
  2. 大多数 OpenCV 函数所做的是将给定的图像复制到另一个稍大的图像上,然后自动填充边界(通过下面示例代码中解释的任何方法)。这样,卷积可以在所需的像素上毫无问题地执行(操作完成后会剪切额外的填充)。
  3. 在本教程中,我们将简要探讨为图像定义额外填充(边框)的两种方法:

    1. BORDER_CONSTANT:用常量值填充图像(即黑色或0)
    2. BORDER_REPLICATE:原稿边缘的行或列将复制到额外的边框。

    这将在“代码”部分中更清楚地看到。

  • 这个程序是做什么的?
    • 加载图像
    • 让用户选择在输入图像中使用哪种填充。有两种选择:

      1. 常量值边框:为整个边框应用常量值的填充。此值将每 0.5 秒随机更新一次。
      2. 复制的边框:边框将从原始图像边缘的像素值复制。

      用户通过按“c”(常量)或“r”(复制)来选择任一选项

    • 当用户按下“ESC”时,程序完成

C++代码:

教程代码如下所示。

您也可以从这里下载

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"using namespace cv;// Declare the variables
Mat src, dst;
int top, bottom, left, right;
int borderType = BORDER_CONSTANT;
const char* window_name = "copyMakeBorder Demo";
RNG rng(12345);int main( int argc, char** argv )
{const char* imageName = argc >=2 ? argv[1] : "lena.jpg";// Loads an imagesrc = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image// Check if image is loaded fineif( src.empty()) {printf(" Error opening image\n");printf(" Program Arguments: [image_name -- default lena.jpg] \n");return -1;}// Brief how-to for this programprintf( "\n \t copyMakeBorder Demo: \n" );printf( "\t -------------------- \n" );printf( " ** Press 'c' to set the border to a random constant value \n");printf( " ** Press 'r' to set the border to be replicated \n");printf( " ** Press 'ESC' to exit the program \n");namedWindow( window_name, WINDOW_AUTOSIZE );// Initialize arguments for the filtertop = (int) (0.05*src.rows); bottom = top;left = (int) (0.05*src.cols); right = left;for(;;){Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );imshow( window_name, dst );char c = (char)waitKey(500);if( c == 27 ){ break; }else if( c == 'c' ){ borderType = BORDER_CONSTANT; }else if( c == 'r' ){ borderType = BORDER_REPLICATE; }}return 0;
}

解释:

声明变量

首先,我们声明将要使用的变量:

// Declare the variables
Mat src, dst;
int top, bottom, left, right;
int borderType = BORDER_CONSTANT;
const char* window_name = "copyMakeBorder Demo";
RNG rng(12345);

特别值得一提的是变量 rng,它是一个随机数生成器。我们用它来生成随机边框颜色,我们很快就会看到。

加载图像

像往常一样,我们加载源图像 src

 const char* imageName = argc >=2 ? argv[1] : "lena.jpg";// Loads an imagesrc = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image// Check if image is loaded fineif( src.empty()) {printf(" Error opening image\n");printf(" Program Arguments: [image_name -- default lena.jpg] \n");return -1;}

创建窗口

在简要介绍了如何使用该程序之后,我们创建了一个窗口:

 // Initialize arguments for the filtertop = (int) (0.05*src.rows); bottom = top;left = (int) (0.05*src.cols); right = left;

循环

程序在无限循环中运行,而未按下 ESC 键。如果用户按“c”或“r”,则 borderType 变量将分别取值 BORDER_CONSTANT 或 BORDER_REPLICATE

 char c = (char)waitKey(500);if( c == 27 ){ break; }else if( c == 'c' ){ borderType = BORDER_CONSTANT; }else if( c == 'r' ){ borderType = BORDER_REPLICATE; }

随机颜色

在每次迭代中(0.5 秒后),随机边框颜色()都会更新......

 Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );

此值是在 [0,255] 范围内随机选择的三个数字的集合。

在图像周围形成边框

最后,我们调用函数 copyMakeBorder()来应用相应的填充:

copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );
  • 参数是:
    1. src:源图片
    2. dst:目标图像
    3. :图像两侧边框的长度(以像素为单位)。我们将它们定义为图像原始大小的 5%。
    4. borderType:定义应用的边框类型。在此示例中,它可以是常量或复制的。
    5. value:如果 borderType 为 BORDER_CONSTANT,则这是用于填充边框像素的值。

显示结果

我们在之前创建的图像中显示输出图像

 imshow( window_name, dst );

结果

  1. 编译上面的代码后,您可以执行它,并给出图像的路径作为参数。结果应为:

    • 默认情况下,它以设置为 BORDER_CONSTANT 的边框开头。因此,将显示一系列随机彩色边框。
    • 如果按“r”,边框将成为边缘像素的复制品。
    • 如果按“c”,随机彩色边框将再次出现
    • 如果按“ESC”,程序将退出。

    下面的一些屏幕截图显示了边框如何改变颜色以及BORDER_REPLICATE选项的外观:

参考文献 :

1、《Adding borders to your images》----Ana Huamán

这篇关于利用Opencv4.9为图像添加边框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922697

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检