基于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()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/84014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Dive into Deep Learning》

《Dive into Deep Learning》:https://d2l.ai/ Interactive deep learning book with code, math, and discussionsImplemented with PyTorch, NumPy/MXNet, JAX, and TensorFlowAdopted at 500 universities from 70 countries 《动手学深度学习》中文版&#xff1…

Java 中使用 ES 高级客户端库 RestHighLevelClient 清理百万级规模历史数据

🎉工作中遇到这样一个需求场景:由于ES数据库中历史数据过多,占用太多的磁盘空间,需要定期地进行清理,在一定程度上可以释放磁盘空间,减轻磁盘空间压力。 🎈在经过调研之后发现,某服务…

【操作系统原理】计算机系统概述

计算机系统概述 操作系统运行环境 用户程序执行____指令发起系统调用,请求操作系统提供服务,这一过程中系统通过____机制从用户态进入核心态。 【答:访管指令(trap)指令,硬件中断】 访管指令是在用户态使用的,并不是…

JavaScript——为什么静态方法不能调用非静态方法

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

TensorFlow中slim包的具体用法

TensorFlow中slim包的具体用法 1、训练脚本文件(该文件包含数据下载打包、模型训练,模型评估流程)3、模型训练1、数据集相关模块:2、设置网络模型模块3、数据预处理模块4、定义损失loss5、定义优化器模块 本次使用的TensorFlow版本…

MathType7MAC中文版数学公式编辑器下载安装教程

如今许多之前需要手写的内容都可以在计算机中完成了。以前我们可以通过word输入一些简单的数学公式,但现在通过数学公式编辑器便可以完成几乎所有数学公式的写作。许多简单的数学公式,我们可以使用输入法一个个找到特殊符号并输入,但是对于高…

LeetCode--HOT100题(42)

目录 题目描述:108. 将有序数组转换为二叉搜索树(简单)题目接口解题思路代码 PS: 题目描述:108. 将有序数组转换为二叉搜索树(简单) 给你一个整数数组 nums ,其中元素已经按 升序 排列&#xf…

单片机学习-蜂鸣器电子元件

蜂鸣器是有什么作用的? 蜂鸣器 是 一种 一体化结构 的电子训响器,可以发出声音的电子元器件 蜂鸣器分类? ①压电式蜂鸣器(图左) 称: 无源蜂鸣器 ②电磁式蜂鸣器(图右) 称&#xf…

Android平台RTMP|RTSP直播播放器功能进阶探讨

我们需要怎样的直播播放器? 很多开发者在跟我聊天的时候,经常问我,为什么一个RTMP或RTSP播放器,你们需要设计那么多的接口,真的有必要吗?带着这样的疑惑,我们今天聊聊Android平台RTMP、RTSP播放…

MAVEN利器:一文带你了解IDEA中如何使用Maven

前言: 强大的构建工具——Maven。作为Java生态系统中的重要组成部分,Maven为开发人员提供了一种简单而高效的方式来构建、管理和发布Java项目。无论是小型项目还是大型企业级应用,Maven都能帮助开发人员轻松处理依赖管理、编译、测试和部署等…

17.4 【Linux】systemctl 针对 timer 的配置文件

有时候,某些服务你想要定期执行,或者是开机后执行,或者是什么服务启动多久后执行等等的。在过去,我们大概都是使用 crond 这个服务来定期处理, 不过,既然现在有一直常驻在内存当中的 systemd 这个好用的东西…

neo4jd3拓扑节点显示为节点标签(自定义节点显示)

需求描述:如下图所示,我的拓扑图中有需要不同类型的标签节点,我希望每个节点中显示的是节点的标签 在官方示例中,我们可以看到,节点里面是可以显示图标的,现在我们想将下面的图标换成我们自定义的内容 那…