opencv_核心操作

图像基本操作

访问和修改像素值

import numpy as np
import cv2
img = cv2.imread('c:/Users/HP/Downloads/basketball.png')
h,w,c = img.shape
#图像大小
print(h,w,c)### 841 1494 3
# 通过行和列坐标访问像素值
img[100,100]### 231
### array([231, 140, 146], dtype=uint8)
# 通过行和列坐标访问像素值
img[100,100]### array([231, 140, 146], dtype=uint8)
# # 仅访问蓝色通道的像素
blue = img[100,100,0]
print(blue)### 231
# 修改颜色
img[100,100] = [255,255,255]
print(img[100,100])### [255 255 255]

Numpy 访问每个像素值并修改其值非常缓慢,

更好的访问和编辑像素的方法:

#访问 红色通道 的值
img.item(10,10,2)### 131
#修改 红色通道 的值
img.itemset((10,10,2),100)
img.item(10,10,2)### 100

访问图像属性

print(img.shape)
# 如果图像是灰度图像,则返回的元组仅包含行数和列数,因此它是检查加载的图像是灰度图还是彩色图的一种很好的方法### (841, 1494, 3)
print(img.size)  # 总像素数### 3769362
print(img.dtype)  # 图像数据类型### uint8

图像中的感兴趣区域

from matplotlib import pyplot as pltplt.imshow(img)

在这里插入图片描述

from matplotlib import pyplot as pltball = img[450:600,450:650]
plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(ball)

在这里插入图片描述

拆分和合并图像通道

b,g,r = cv2.split(img)  # 分割为单通道
img = cv2.merge((b,g,r))  # 合并b = img[:,:,0]  # 或者使用numpy.array的切片方法img[:,:,2] = 0  # 要将所有红色像素设置为零,则无需先拆分通道;Numpy 索引更快## warning:CV.spilt()是一项代价高昂的操作(就时间而言)。所以只在你需要时再这样做,否则使用 Numpy 索引。

制作图像边界(填充)

import cv2 as CV
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255,0,0]
img1 = img
replicate = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_REPLICATE)
reflect = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_REFLECT)
reflect101 = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_REFLECT_101)
wrap = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_WRAP)
constant= CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

在这里插入图片描述

图像的算术运算

图像加法

# 可以通过 cv.add()或简单地通过 numpy 操作将两个图像相加,res = img1 + img2;
# 两个图像应该具有相同的深度和类型,或者第二个图像可以是像素值,比如(255,255,255),白色值。img1 = cv2.imread('c:/Users/HP/Downloads/basketball.png')
img2 = cv2.imread('c:/Users/HP/Downloads/jump.png')
res = img1 + img2plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(res)

在这里插入图片描述

图像混合

也是加法,但两幅图像的权重不同,就会给人一种混合或者透明的感觉。图像混合的计算公式如下:

g(x) = (1−α)f0(x) + αf1(x)

函数cv2.addWeighted()可以按下面的公式对图片进行混合操作:

dst = α⋅img1 + β⋅img2 + γ

dst = cv2.addWeighted(img1,0.7, img2,0.3, 0)plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(dst)

在这里插入图片描述

按位操作

这包括按位 AND,OR,NOT 和 XOR 运算。它们在提取图像的某一部分(我们将在后面的章节中看到)、定义和使用非矩形 ROI 等方面非常有用。示例:

假如我想加一个OpenCV的 logo在一个图像上,如果只是简单的将两张图像想加,则会改变叠加处的颜色;

如果进行上面所说的混叠操作,则会得到一个有透明效应的结果,但我希望得到一个不透明的logo;

如果logo是一个矩形logo,那可以用上节所讲的ROI来做;

但是OpenCV的logo是不规则形状的,所以用下面的bitwise操作来进行:

#加载两张图片
img1 = cv2.imread('c:/Users/HP/Downloads/basketball.png')
img2 = cv2.imread('c:/Users/HP/Downloads/opencv_logo.png')#我想在左上角放置一个logo,所以我创建了一个 ROI,并且这个ROI的宽和高为我想放置的logo的宽和高
rows,cols,channels = img2.shape
roi = img1 [0:rows,0:cols]#现在创建一个logo的掩码,通过对logo图像进行阈值,并对阈值结果并创建其反转掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret,mask = cv2.threshold(img2gray,10,255,cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)#现在使 ROI 中的徽标区域变黑
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(img1_bg)#仅从徽标图像中获取徽标区域。
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)#在 ROI 中放置徽标并修改主图像
dst2 = cv2.add(img1_bg,img2_fg)
res = img1
res [0:rows,0:cols] = dst2plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(res)

在这里插入图片描述

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

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

相关文章

额定值高于 1 kW 的电机驱动应用使用 GaN 逆变器 IC

GaN 技术的三个重要的参数是更高的带隙、临界场和电子迁移率。当这些参数结合起来时,由于 GaN 晶体的临界场高 10 倍,因此与硅 MOSFET 相比,电端子之间的距离可以近 10 倍。这导致了 GaN 和硅之间的明显区别:中压 GaN 器件可以基于…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(初步实践)

系列篇章💥 No.文章1AI大模型探索之路-实战篇:智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇:智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获…

list容器的基本使用

目录 前言一,list的介绍二,list的基本使用2.1 list的构造2.2 list迭代器的使用2.3 list的头插,头删,尾插和尾删2.4 list的插入和删除2.5 list 的 resize/swap/clear 前言 list中的接口比较多,与string和vector类似&am…

【javaScript数组,函数】的基础知识点

【javaScript数组,函数】基础知识点 1.关于JavaScript2.数组3.函数 📍📍📍📍📍📍📍🫡🫡🫡🫡🫡🫡 本文主要讲解…

【数据库设计】宠物商店管理系统

目录 🌊1 问题的提出 🌊2 需求分析 🌍2.1 系统目的 🌍2.2 用户需求 🌻2.2.1 我国宠物行业作为新兴市场,潜力巨大 🌻2.2.2 我国宠物产品消费规模逐年增大 🌻2.2.3 我国宠物主选…

SCSS 和 Sass的区别?

SCSS 和 Sass 都是 CSS 的预处理器,它们的主要区别在于语法风格和一些具体的语法特性。 以下是 SCSS 和 Sass 的详细对比: 1. 语法风格 SCSS (Sassy CSS) SCSS 是 Sass 的一种语法,是 CSS 的超集,完全兼容所有的 CSS 语法。 使用…

GPT办公与科研应用、论文撰写、数据分析、机器学习、深度学习及AI绘图高级应用

原文链接:GPT办公与科研应用、论文撰写、数据分析、机器学习、深度学习及AI绘图高级应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247606667&idx3&sn2c5be84dfcd62d748f77b10a731d809d&chksmfa82606ccdf5e97ad1a2a86662c75794033d8e2e…

Http协议:Http缓存

文章目录 Cookie和Session缓存有效性检查整体流程总结Cookie和Session Cookie 客户端的缓存 Session 服务端的缓存,存储服务器与客户端一次会话的过程中的数据/资源 两者区别 是服务端与客户端的不同需求造成的 有效期 Cookie的有效期很长,Session的较短 原因:服务…

数据结构-树的性质

树的定义 树是一个有限数据元素的集合,当数据的量为0时,称为空树。 在一个非空树T中,最上方的结点没有前驱结点,称为根节点。在一个数据量大于1的树中,除了根节点之外的其余数据元素可以被分为m个互不相交的集合T1,T2,…

[leetcode]删除链表中倒数第k个结点

. - 力扣(LeetCode) class Solution { public:ListNode* trainningPlan(ListNode* head, int cnt) {int n 0;ListNode* node nullptr;for (node head; node; node node->next) {n;}for (node head; n > cnt; n--) {node node->next;}retu…

场外期权如何开户?开户有哪些流程?

今天带你了解场外期权如何开户?开户有哪些流程?场外期权是一种金融衍生品,其开户流程和条件对于投资者来说至关重要。 场外期权如何开户? 需要满足532资质,参与者需为法人、合伙企业或其他组织,最近一年末…

《吸血鬼猎人D》观后感

前言 在B站无意中发现了一部动漫电影《吸血鬼猎人D》,看着封面还不错,就试着点开了视频,看了一会儿,发现画面很精美,人物造型高大威猛,肌肉线条清晰可见。如果我没记错的话,这种风格在日本动漫中…

填报志愿选大学专业,文科生如何选专业?

读文科的同学接触的专业知识相对广泛,往往被认为是“万金油”,他们仿佛什么都能做,但是和专业技能类知识不同,缺乏技术支持,从而使得文科专业的就业方向和前景远远比不上理科专业那么明朗,对于众多文科生而…

Unity基于EventSystem让SpriteRenderer支持点击事件

若2D场景中使用了UGUI的UI系统,则默认是有EventSystem的。否则可以创建个UGUI的物体,然后保留EventSystem,删除其它不需要的。 场景主相机添加Physics2DRaycaster组件,并妥善设置其EventMask属性。 为SpriteRenderer物体添加诸如…

(5)按钮输入

文章目录 前言 1 基础设置 2 数字逻辑/模拟电压设置 3 PWM输入设置 4 额外设置 前言 连接到自动驾驶仪的最多四个外部按钮或开关可以被配置为触发辅助功能(Auxiliary Functions),类似于 RC 通道开关的触发方式。这些按钮输入可以被配置为使用数字逻辑电平电压…

U-Mail反垃圾邮件网关助力企业抵御垃圾邮件,守护邮箱安全

在数字化时代,电子邮件已成为企业沟通不可或缺的工具,它在促进信息流通和提高工作效率方面扮演着关键角色。然而,随着电子邮件使用的普及,垃圾邮件问题也日益凸显,特别是那些携带恶意软件或钓鱼链接的邮件,…

SQL 基础入门教程

目录 什么是 SQL? SQL 的基本操作 数据库的创建和删除 表的创建和删除 数据的插入 数据的查询 数据的更新 数据的删除 SQL 的高级操作 表的连接 聚合函数 分组和排序 子查询 视图 索引 SQL 的数据完整性和约束 总结 SQL(Structured Que…

Web前端标记类型:深入剖析HTML、CSS与JavaScript的奥秘

Web前端标记类型:深入剖析HTML、CSS与JavaScript的奥秘 在构建丰富多彩的Web前端世界时,标记类型是至关重要的基石。它们不仅是网页内容的载体,更是实现页面布局、样式和交互的关键。本文将围绕HTML、CSS和JavaScript这三种核心标记类型&…

筛斗数据:如何利用数据提取技术通告能源利用效率

在当前的数字时代,数据提取技术已成为推动能源利用效率提升的重要工具。随着技术的进步和数据分析方法的创新,我们现在能够更精确地监测、分析和优化能源使用,从而实现节能减排和经济效益的双重目标。以下是几种关键的方法来展示如何利用数据…

深度学习(六)——神经网络的基本骨架:nn.Module的使用

一、torch.nn简介 官网地址: torch.nn — PyTorch 2.0 documentation 1. torch.nn中的函数简介 Containers:神经网络的骨架 Convolution Layers:卷积层 Pooling layers:池化层 Padding Layers:Padding Non-linear …