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.rhkb.cn/news/346817.html

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

相关文章

Windows下 CLion中,配置 OpenCV、LibTorch

首先按照win下C部署深度学习模型之clion配置pytorchopencv教程记录 步骤配置。 LibTorch 部分 在测试LibTorch时会出现类似 c10.dll not found 的问题(Debug才有): 参考C部署Pytorch(Libtorch)出现问题、错误汇总和 …

高内聚与低耦合:工作中的重要性与应用

目录 前言 1.什么是高内聚与低耦合? 2.为什么高内聚和低耦合非常重要? 3.工作中的运用 总结 前言 在软件开发领域,高内聚与低耦合是设计原则中非常重要的概念。高内聚指的是模块内部的各个元素紧密地结合在一起,完成单一的功…

解决Android Studio Iguana版本不显示原创的GradleTask问题

问题描述: 下面是我的AndroidStudio版本号,升级后我发现项目里面自定义的gradletask找不到了??? 解决方案: 1、去setting里面把下面红框里面的选项勾选一下,缺点就是sync的时候会慢一些。 2、…

芯片级激光器研发取得新进展

欢迎关注GZH《光场视觉》 自 20 世纪 60 年代以来,激光给世界带来了革命性的变化,如今已成为从尖端手术和精密制造到光纤数据传输等现代应用中不可或缺的工具。 但是,随着激光应用需求的增长,挑战也随之而来。例如,光…

具有P柱中N点区域的超结MOSFET,用于软恢复

来源:Superjunction MOSFET with an N-dot region in the P-pillar for Soft Reverse Recovery(ISPSD 24年) 摘要 在本文中,提出了一种新型的具有P柱中N点区域的超结MOSFET,并进行了实验研究。利用硼和砷扩散速率的差…

STM32项目分享:智能门禁锁系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

【STM32HAL库学习】定时器功能、时钟以及各种模式理解

一、文章目的 记录自己从学习了定时器理论->代码实现使用定时->查询数据手册,加深了对定时器的理解以及该过程遇到了的一些不清楚的知识。 上图为参考手册里通用定时器框图,关于定时器各种情况的工作都在上面了,在理论学习和实际应用后…

针对AlGaN/GaN高电子迁移率晶体管的显式表面电势计算和紧凑电流模型

来源:An Explicit Surface Potential Calculation and Compact Current Model for AlGaN/GaN HEMTs(EDL 15年) 摘要 在本文中,我们提出了一种新的紧凑模型,用于基于费米能级和表面电位的显式解来描述AlGaN/GaN高电子迁移率晶体管。该模型计算…

函数计时的方法

1. console 对象 可以调⽤ console 对象的 time 和 timeEnd ⽅法来对⼀段程序进⾏时间计算。例如: function fib(n) {if (n 0) return;let a arguments[1] || 1;let b arguments[2] || 1;[a, b] [b, a b];fib(--n, a, b); } console.time(); // 记时开始 fib…

人工智能与能源约束的矛盾能否化解

以下文章来源:澎湃新闻 人工智能技术在台前展示的是比特世界的算力、算法和数据,但其“轻盈的灵魂”背后则是土地、能源和水等物理世界“沉重的肉身”。根据本文三种情境的模拟测算,未来人工智能发展需要可持续的巨量能源支撑,能源…

公用nacos,实现只调用本机相应服务,不出现负载均衡到别人机器上

当我们有两个研发同时在调试一个微服务模块时,你和对方本地都会启动服务,这就导致在nacos会同时注册两个实例。默认情况下请求这个服务,具体处理请求的程序会在你和对方之间来回轮询,即一下你的服务一下对方的服务。 其结果就导…

wordpress里面嵌入哔哩哔哩视频的方法

我们正常如果从blibli获取视频分享链接然后在wordpress里面视频URL插入,发现是播放不了的 而视频嵌入代码直接粘贴呢窗口又非常的小 非常的难受,就需要更改一下代码。你可以在在allowfullscreen"true"的后面,留1个空格&#xff…

直线度测量仪发展历程!

直线度测量仪的发展历程可以概括为以下几个关键阶段: 拉钢丝法: 早期直线度测量的简单直观方法,利用钢丝受重力自然下垂的原理来测量直线度误差。 随着机械设备的大型化和测量精度要求的提高,该方法逐渐无法满足要求,正…

yg校园易购电商系统(Go+Vue)

校园易购二手平台系统 GitHub项目地址:https://github.com/xzhHas/yg 文章目录 校园易购二手平台系统一、技术栈简介二、快速开始1、安装本系统使用到的插件,这里推荐使用docker安装,此操作皆在ubuntu系统下操作,如果是其他系统只…

回首二篇旧博客再看一篇新博客

交流 旧博客 https://www.zhihu.com/question/390894125 从2050回顾2020,职业规划与技术路径(节选) 行业发展好,与我能在这个行业找到工作是两回事; 同理,行业发展好,与我能在这个行业赚到钱…

从数据采集到部署,手把手带你训练一个高质量的图像分类模型

本文来自社区投稿,作者李剑锋 MMPreTrain 是一款基于 PyTorch 的开源深度学习预训练工具箱,本文将从数据采集到部署,手把手带大家使用 MMPreTrain 算法库训练一个高质量的图像分类模型。 MMPreTrain 项目链接: https://github.co…

易保全网络赋强公证系统,“公证赋强+科技赋能”双重增信

网络赋强公证系统是一种创新的法律服务模式,旨在通过线上方式赋予债权文书强制执行效力。具体来说,该系统结合了互联网技术与公证业务,允许公证机构根据当事人的申请,利用互联网公证技术手段对互联网上的债权文书进行公证&#xf…

移动端浏览器的扫描二维码实现(vue-qrcode-reader与jsQR方式)

1. 实现功能 类似扫一扫的功能,自动识别到画面中的二维码并进行识别,也可以选择从相册中上传。 2. 涉及到的一些插件介绍 vue-qrcode-reader 一组用于检测和解码二维码的Vue.js组件 jsQR 一个纯粹的javascript二维码阅读库,该库接收原始…

Activity->Activity中动态添加Fragment->add和replace方式添加的区别

XML文件 Activity布局文件R.layout.activity_main <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/root_ll"android:orientation"v…

操作系统期末复习(大题)

1. 进程调度 周转时间作业完成时刻-作业到达时刻 带权周转时间周转时间/服务时间 平均周转时间各个作业周转时间之和/作业个数 操作系统&#xff1a;周转时间和其他时间_系统为作业提供的时间-CSDN博客 2. 进程调度 3. 调度算法 4. 临界区互斥访问问题 即证明是否满足互斥&a…