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

基于OpenCV实战(基础知识二)

目录

简介

1.ROI区域

2.边界填充

3.数值计算

4.图像融合


简介

OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C++语言编写,同时也支持Python、Java、C等语言。由于其开源和广泛使用的特点,在计算机视觉和机器学习领域得到了广泛的应用。

1.ROI区域

截取我们感兴趣的区域:在一张图像中,我们可能只需要其中的一部分,那我们如何截取这部分呢?

在上一篇文章,我们提到图片的本质可以由一组数组来表示

那么我们是否可以用切片来选择我们想要的区域呢

import cv2image = cv2.imread('image/1.jpg')
cat = image[250:500, 250:500]
cv2.imshow('IMG', cat)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们知道,图像是一组三维的数据,既然我们在平面上进行切片得到我们想要的区域,那么我们是否可以对它的通道进行切分呢?

import cv2
import numpy as npimage = cv2.imread('image/1.jpg')# cat = image[250:500, 250:500]
# cv2.imshow('IMG', cat)
b,g,r = cv2.split(image)
cat = np.hstack((b,g,r))
cv2.imshow('IMG',cat)cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.split()是OpenCV中的一个函数,用于将多通道图像拆分成各个单通道图像。

为什么都是是灰色的呢,因为提取完后的图片,本质变成了单通道。

那么我想要是那种红色的图片要怎么做呢?

第一种思路:把三个通道分别提取出来,然后创建一个类似图像数据的空数组,最后把你想要的那个通道填充进去

第二种思路:把另外两个通道的值重新复制为0,只保留希望的颜色通道。

import cv2
import numpy as npimage = cv2.imread('image/1.jpg')img = image.copy()
b, g, r = cv2.split(img)
arr = np.zeros_like(image)
arr[:, :, 2] = r
print(arr)
cv2.imshow('IMG',arr)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2image = cv2.imread('image/1.jpg')img = image.copy()
img[:,:,0] = 0
img[:,:,1] = 0cv2.imshow('IMG', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

2.边界填充

在图像处理中,常用的边界填充方法有以下几种

常数填充(Constant Padding):使用固定的像素值填充边界。可以通过 cv2.copyMakeBorder() 函数实现,指定 borderType=cv2.BORDER_CONSTANT

复制填充(Replicate Padding):将边界像素的值复制到图像边界。可以通过 cv2.copyMakeBorder() 函数实现,指定 borderType=cv2.BORDER_REPLICATE

反射填充(Reflect Padding):将边界像素值按照镜像方式填充。可以通过 cv2.copyMakeBorder() 函数实现,指定 borderType=cv2.BORDER_REFLECT

import cv2
import numpy as npimage = cv2.imread('image/1.jpg')
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)replicate = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
constant = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT,value=0)
# print(image)
#
result = np.hstack((constant,reflect, replicate))cv2.imshow('IMG', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

当使用cv2.copyMakeBorder()函数进行边界填充时,有几个参数需要理解和设置:

  1. src:原始图像,即要进行边界填充的图像。

  2. topbottomleftright:指定要在图像的上方、下方、左侧和右侧添加的边界大小。可以为每个边界分别设置不同的大小,也可以将它们设置为相同的值。

  3. borderType:指定边界填充的方法。常用的参数选项包括:

    • cv2.BORDER_CONSTANT:常数填充,使用固定的像素值填充边界。
    • cv2.BORDER_REPLICATE:复制填充,将边界像素的值复制到图像边界。
    • cv2.BORDER_REFLECT:反射填充,将边界像素值按照镜像方式填充。
    • cv2.BORDER_WRAP:复制边界填充,将图像水平或垂直方向的边缘复制到对应边界。
  4. value:仅适用于borderType=cv2.BORDER_CONSTANT情况下,指定要用于填充边界的常数值。可以是一个标量(单个数值)或一个包含与图像通道数匹配的数值的元组。

3.数值计算

第一种,numpy层面的相加,ps 如果数值超过255 会自动对255取余

import cv2
import numpy as npimage1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')# img = np.array(image1)
image1_1= image1 + 10print(np.array(image1[:5,:,0]))
print(np.array(image1_1[0:5,:,0]))

第二种,opencv提供的函数

cv2.add(image1,image2)    需要保证图片的尺寸一样

import cv2
import numpy as npimage1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')
if image1.shape != image2.shape:image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0]))
# img = np.array(image1)
image1_1 = image1 + 10
result = cv2.add(image1 ,image2)
print(np.array(image1[:5, :, 0]))
print(np.array(result[:5, :, 0]))

 与numpy不同的是它的数值不会超过255

4.图像融合

cv2.addWeighted() 函数是 OpenCV 中用于图像融合的函数

函数的语法如下:

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
  • src1:要融合的第一个输入图像。

  • alpha:第一个输入图像的权重系数。它表示 src1 图像在融合结果中所占比例。

  • src2:要融合的第二个输入图像。

  • beta:第二个输入图像的权重系数。它表示 src2 图像在融合结果中所占比例。

  • gamma:亮度调节参数。它是一个可选的参数,用于进一步调整融合结果的亮度。

  • 首先需要注意的一点是,图像融合的两张图片的shape必须一致,不然无法融合。

如下所示

import cv2image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

所以在融合前我们需要,将图片的shape设为一致

import cv2image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')
# 调整两个图像的大小以保持一致image1 = cv2.resize(image1, (500, 500))
image2 = cv2.resize(image2, (500, 500))blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

相关文章:

基于OpenCV实战(基础知识二)

目录 简介 1.ROI区域 2.边界填充 3.数值计算 4.图像融合 简介 OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。Ope…...

PhantomJS+java 后端生成echart图表的图片

PhantomJSjava 后端生成echart图表的图片 前言源码效果实现echarts-convertPhantomJS实现echarts截图得到图片java延时读取base64数据 参考 前言 该项目仅用作个人学习使用 源码 地址 docker镜像: registry.cn-chengdu.aliyuncs.com/qinjie/java-phantomjs:1.0 …...

vue3 基础知识 ( webpack 基础知识)05

你好 文章目录 一、组件二、如何支持SFC三、webpack 打包工具四、webpack 依赖图五、webpack 代码分包 一、组件 使用组件中我们可以获得非常多的特性: 代码的高亮;ES6、CommonJS的模块化能力;组件作用域的CSS;可以使用预处理器来…...

1.4亿X区智慧城市数字平台及城市大脑(运营中心)建设项目WORD

导读:原文《1.4亿X区智慧城市数字平台及城市大脑(运营中心)建设项目WORD》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 部分内…...

wps 画项目进度甘特图

效果如上 步骤一: 创建excel 表格 步骤二: 选中开始时间和结束时间两列数据,右键设置单元格格式 步骤三: 选择数值,点击确定,将日期转成数值。 步骤四:插入图表 选中任务,开始时间…...

【⑭MySQL | 数据类型(二)】字符串 | 二进制类型

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串 | 二进制类型类型的分享✨ 目录 前言5 字符串类型6 二进制类型总结 5 字符串类型 字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比…...

Java smslib包开发

上一篇文章我详细介绍RXTXcomm的安装方法和简单代码,如果小伙伴涉及到需要使用手机短信模块完成短信收发需求的话,可以使用到smslib进行开发。 首先还是同样的,将整个smslib包源码导入项目,并且将它所需依赖一起进行导入 导入完成之后,我们就可以对smslib包进行二次开发了 下面…...

职业技术培训内容介绍

泰迪职业技术培训包括:Python技术应用、大数据技术应用、机器学习、大数据分析 、人工智能技术应用。 职业技术培训-Python技术应用 “Python技术应用工程师”职业技术认证是由工业和信息化部教育与考试中心推出一套专业化、科学化、系统化的人才考核标准&…...

AUTOSAR规范与ECU软件开发(实践篇)6.2 ETAS RTA系列工具入门

目录 1、 RTA系列工具安装方法 (1) ETAS RTA-RTE的安装方法 (2) ETAS RTA-BSW的安装方法...

vue3的hooks你可以了解一下

更详细的hooks了解参考这个大佬的文章:掘金:Hooks和Mixins之间的区别 刚开始我简单看了几篇文章感觉Hooks这个东西很普通,甚至感觉还不如vue2的mixin好用。还有export import 感觉和普通定义一个utils文件使用没什么区别。但是Hooks这个东西肯…...

面试之HTTP

1.HTTP与HTTPS的区别 HTTP运行在TCP之上;HTTPS是运行在SSL之上,SSL运行在TCP之上两者使用的端口不同:HTTP使用的是80端口,HTTPS使用的是443端口安全性不同:HTTP没有加密,安全性较差;HTTPS有加密…...

测试框架pytest教程(3)夹具-@pytest.fixture

内置fixture Fixture使用pytest.fixture装饰,pytest有一些内置的fixture 命令可以查看内置fixture pytest --fixtures fixture范围 在pytest中,夹具(fixtures)具有不同的作用范围(scope),用于…...

GNU make系列之介绍Makefile

一.欢迎来到我的酒馆 在本章节介绍Makefile。 目录 一.欢迎来到我的酒馆二.GNU make 预览三.一个简单的Makefile四.make程序如何处理Makefile文件五.在Makefile中使用变量 二.GNU make 预览 2.1 GNU make工具会自动决定哪些程序需要被重新编译,并且执行相应的命令来…...

Java8新特性之——方法引用

文章目录 一、简介二、举例实例方法引用(实例对象::实例方法名)静态方法引用(类名::静态方法名)类成员方法引用(类名::实例方法名)构造方法引用(类名::new)数组构造方法引用&#xf…...

等保测评--安全区域边界--测评方法

安全子类--边界防护 a) 应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信; 一、测评对象 网闸、防火墙、路由器、交换机和无线接入网关设备等提供访问控制功能的设备或相关组件 二、测评实施 1)应核查在网络边界处是否部署访问控制设备&#x…...

【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息

【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息 文章目录 一、前言二、安装和基本使用三、实际业务中的用法四、完整示例五、总结 一、前言 在这篇博客中,我将为你介绍一个非常实用的 Flutter 插件:device_info_plus。这个插件…...

Flink、Yarn架构,以Flink on Yarn部署原理详解

Flink、Yarn架构,以Flink on Yarn部署原理详解 Flink 架构概览 Apache Flink是一个开源的分布式流处理框架,它可以处理实时数据流和批处理数据。Flink的架构原理是其实现的基础,架构原理可以分为以下四个部分:JobManager、TaskM…...

软考高级系统架构设计师系列论文八十三:论软件设计模式的应用

软考高级系统架构设计师系列论文八十三:论软件设计模式的应用 一、软件设计模式相关知识点二、摘要三、正文四、总结一、软件设计模式相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构...

CDH集群离线配置python3环境,并安装pyhive、impyla、pyspark

背景: 项目需要对数仓千万级数据进行分析、算法建模。因数据安全,数据无法大批量导出,需在集群内进行分析建模,但CDH集群未安装python3 环境,需在无网情况下离线配置python3环境及一系列第三方库。 采取策略&#xf…...

python并行操作(基于concurrent.futures.ThreadPoolExecutor)

文章目录 一、明确自身cpu可并行的核数二、根据所有任务计算在各个核上平均跑多少任务三、最后把任务划分在不同的核上跑四、拿来主义 此为利用cpu并行计算的能力,充分利用cpu在循环时并行计算。其实也是受C并行操作的影响,如果需要C版,可以移…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

日常一水C

多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

xmind转换为markdown

文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...