opencv_核心操作

news2024/11/18 23:21:26

图像基本操作

访问和修改像素值

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 plt

plt.imshow(img)

在这里插入图片描述

from matplotlib import pyplot as plt

ball = 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 + img2

plt.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] = dst2

plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(res)

在这里插入图片描述

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

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

相关文章

WordPress 站点 Wp-Login.Php 登录页面,防止被机器扫描爆破终极方法

最近好像不少的 WordPress 站点又迎来了一波疯狂的 wp-login.php 登录页面暴力破解,明月使用的 Dragon 主题也迅速的做出了安全防范响应,第一时间就增强了代码上的安全防御能力。明月代运维的几个站点也在这方面加强了防范措施,基本上实现了永久解决这一顽疾的目标,今天明月…

智能编程支持分析本地工程文件,项目级开发效率再度提升!

CodeGeeX的智能问答新增关联本地文件的系列功能,用户在智能问答的输入框中输入,就可以在弹出框中选择需要使用的指令。从而能够针对所关联的文件给出更有针对性的问答和代码建议。 下面我们将分别介绍在编程工作中,如何关联本地文件&#xff…

Shell脚本01

一、shell脚本 脚本就是可运行的代码的集合,脚本语言(计算机语言)。 脚本的特点:从上到下,按行执行。 shell 脚本就是在shell环境(bin/bash)bash就是shell解释器,linux环境下的编…

pytest+requests+allure自动化测试接入Jenkins学习

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 最近在这整理知识,发现在pytest的知识文档缺少系统性,这里整理一下&…

MCU为什么上电不启动

相信很多朋友们都遇到过,自信满满的将程序下载到板子上,发现MCU居然没启动。 那这个现象可能有很多问题会导致,让我们来看看会有哪些原因。 1、BOOT引脚电平不对: 在GD32 MCU上,BOOT引脚决定了MCU的启动方式&#x…

zabbix监控深信服AD案例+自动发现虚拟服务和链路

文章目录 前言监控功能告警功能 环境准备操作步骤深信服AD开启SNMPSNMP V2SNMP V3 Zabbix导入模版Zabbix中添加深信服AD 前言 深信服AD,应用交付网关,是较为常见的应用发布、负载均衡设备,常用于网络出口。 本案例是通过zabbix的snmp监控深…

拥抱AI-图片学习中的卷积神经算法详解

一、定义 卷积神经算法(Convolutional Neural Networks, CNN)是深度学习领域中的一种重要算法,特别适用于处理图像相关的任务。以下是卷积神经算法的详细解释: 1. 基本概念 定义:卷积神经网络是一类包含卷积计算且具…

网络代理加速器:太阳HTTP的新一代解决方案(网络代理IP)

在当今数字化时代,网络速度与稳定性是企业和个人用户最为关注的重要问题之一。面对不稳定的网络连接,延迟高和速度慢等问题,传统的网络代理已经难以满足用户的需求。 为了解决这一问题,太阳HTTP推出了全新一代的网络代理加速器&a…

SQL Server 2016导入.bak文件到数据库里面步骤

1、打开SSMS管理器 选择数据库 右键 然后点击还原数据库。 2、选择设备 然后点击三个点 找到本地bak文件,然后点击确定 3、点击确定,会自动弹出来一个成功的提示。

消费增值模式引领业绩飙升与用户活跃

大家好,我是吴军,致力于为您揭示私域电商领域的独特魅力与机遇。 今日,我很高兴与大家分享一个激动人心的成功案例。我们的客户在短短一个月的时间里,业绩就飙升至上百万级别,其用户活跃度更是居高不下,日…

express+宝塔实现文件上传服务

文章目录 服务器部分开启存放文件的端口配置nginx该端口入口手动在/www/wwwroot/file目录下存放一张图片进行访问 express接口部分代码测试 服务器部分 开启存放文件的端口 我这里以83为例 先到对应的服务商开启端口,比如我这里是阿里云 测试,比如这里…

武汉凯迪正大—绝缘强度的测试设备 工频高压耐压交流试验仪 工频耐压试验机

武汉凯迪正大电气有限公司生产KDJS-8A全自动工频耐压试验系统(10kVA全自动操作台),是根据国家行业试验标准而设计的试验设备,其安全可靠、功能强、使用方便、维护简单。主要用于对各种电器产品、电气元件、绝缘材料等进行规定电压…

vue3根据按钮切换更新echarts对应的数据

效果图 初始化注意 setOption的函数定义,option是指图表的配置项和数据,notMerge是指是否不跟之前设置的 option 进行合并。默认为 false。即表示合并。如果为 true,表示所有组件都会被删除,然后根据新option 创建所有新组件 //…

如何学习Django4?看这16堂课就够了

目录 写在前面 推荐图书 内容简介 作者简介 前言/序言 改编说明 推荐理由 写在后面 写在前面 本期博主给大家推荐一本关于Python Django4的图书(2024年3月刚出版),感兴趣的小伙伴快来看看吧! 推荐图书 《Python Django…

网络安全比赛-网络安全事件响应-Server2216(解析)

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1、黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 2、黑客通过网络攻入本地服务器,…

72、AndroidStudio 导入项目Connect timed out错误解决

一、背景: 开发过程中难免会 clone 其他的项目,clone 或者下载成功之后。使用 android studio 打开项目时经常遇到 Connect timed out错误如图所示: 二、分析原因: 1、既然链接超时,肯定是 android studio 在运行…

python 魔术方法备忘录

python 魔术方法备忘录 网上收集了一些,列出了比较常用的,特别是第一张。 Python中的魔术方法(Magic Methods),也被称为特殊方法(Special Methods)或双下划线方法(Dunder Methods&a…

开放式耳机哪个品牌质量比较好?2024热门王炸品牌推荐!

开放式耳机市场繁杂,品质参差不齐。网红推荐、广告轰炸,让人眼花缭乱。但音频工程师告诉你,音质和舒适度才是关键。我根据多款开放式耳机测评结果,为大家提供选购指南,助你避开陷阱,找到心仪之选。 1、购买…

老版_zabbix安装与grafana可视化的安装(zabbix插件4.1.4)

grafana()的安装 查询、可视化和理解数据,并获取数据警报,无论数据存储在何处。在 Grafana,您可以通过美观、灵活的数据面板创建、探索和共享所有数据。 1. 网络下载安装 [itwisenode2 ]$ cd /opt/software/ #进入下载目录 #下载wegt安装命…

设计模式学习(二)工厂模式——工厂方法模式

设计模式学习(二)工厂模式——工厂方法模式 前言工厂方法模式简介示例优点缺点使用场景 前言 前一篇文章介绍了简单工厂模式,提到了简单工厂模式的缺点(违反开闭原则,扩展困难),本文要介绍的工…