opencv - 2 - 核心操作

news/2024/11/15 10:15:48/文章来源:https://www.cnblogs.com/CoderWangEx/p/18396572

一、图像的基本操作

1、访问像素值并修改它们

当成一个三维数组访问即可

import cv2 as cv
import numpy as npimg = cv.imread("img/1.png")
oneElement = img[100,100]
print(oneElement)
# 会得到[51 35  2]
oneElementColor = img[100,100,0]
print(oneElementColor)
# 会得到51

2、访问图像属性

图像属性包括行数,列数和通道数,图像数据类型,像素数等

  • img.shape 得到行,列和通道数的元组(如果图像是彩色的)
  • img.shape 得到行,列(如果图像是灰度的)
  • img.size 得到要素数量
  • img.dtype 得到图像数据类型,一般为uint8

3、设置感兴趣区域(ROI)

本质上就是数组切割

import cv2 as cv
import numpy as npimg = cv.imread("img/1.png")
ball = img[280:340, 330:390]
cv.imshow("ball",ball)
cv.waitKey(0)
cv.destroyAllWindows()

image

img[273:333, 100:160] = ball 

甚至还能把这个img又赋值回原来图像中的一部分

4、分割和合并图像

import cv2 as cv
import numpy as npimg = cv.imread("img/1.png")
b,g,r = cv.split(img)
# 可以将彩色通道拆分成为三个灰度通道,主要这三个灰度通道的shape都是二维数组
print(b.shape)
print(g.shape)
print(r.shape)
# b[:,:] = 0
img = cv.merge((b,g,r))
# 对通道进行修改之后又可以合成为彩色通道
cv.imshow("image",img)
cv.waitKey(0)
cv.destroyAllWindows()

5、图像边框

cv.copyMakeBorder()

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)

二、改变颜色空间

即将图像从一个色彩空间转换到另一个色彩空间
只有两个最广泛使用的,BGR↔灰色和BGR↔HSV。
(HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为[0,255]。不同的软件使用不同的规模。因此,如果你要将OpenCV值和它们比较,你需要将这些范围标准化。)

img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
得到
image
img = cv.cvtColor(img, cv.COLOR_BGR2HSV)
得到
image
通过hsv可以更好的选中色彩方位

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)while True:_,frame = cap.read()hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)lower_blue = np.array([110,50,50])upper_blue = np.array([130,255,255])mask = cv.inRange(hsv, lower_blue, upper_blue)# 得到一个只在有效范围内不是0的区域res = cv.bitwise_and(frame,frame, mask=mask)# 只显示在mask范围内的frame# cv.imshow('hsv', hsv)cv.imshow('res', res)# cv.imshow('mask', mask)# cv.imshow('frame',frame)k = cv.waitKey(5) & 0xFFif k == 27:break
cv.destroyAllWindows()
  • 1、先转换为hsv
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
mask = cv.inRange(hsv, lower_blue, upper_blue)
  • 2、再根据hsv的色彩范围选中区域,形成roi
mask = cv.inRange(hsv, lower_blue, upper_blue)
  • 3、再用and将原图与原图合成,并只显示roi内的内容
res = cv.bitwise_and(frame,frame, mask=mask)

三、图像变换

1、放大缩小

import cv2 as cv
import numpy as np
import mathimg1 = cv.imread("img/1.png")
cv.imshow("img1",img1)
height,width = img1.shape[:2]
# 方法1
# 注意传入的dsize参数必需是整数,所以需要一个取整函数
img2 = cv.resize(img1,(math.ceil(0.25*width), math.ceil(0.25*height)), interpolation = cv.INTER_CUBIC)
cv.imshow("img2",img2)
# 方法2
img3 = cv.resize(img1,None,fx=0.5, fy=0.5, interpolation = cv.INTER_CUBIC)
cv.imshow("img3",img3)
cv.waitKey(0)
cv.destroyAllWindows()

2、平移

width =列数,height =行数
利于图像与该矩阵相乘即可得到移动后的矩阵
image
tx为x轴上移动的距离
ty为y轴上移动的距离

import numpy as np
import cv2 as cv
img = cv.imread('img/1.png',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))
# 最后一个参数为图像的大小
cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()

四、形态学变换

import cv2 as cv
import numpy as np
img = cv.imread('img/1.png')
kernel = np.ones((5,5),np.uint8)
img1 = cv.erode(img,kernel,iterations = 1)  # 侵蚀,黑色部分将扩大,会把一些白色噪点去除
img2 = cv.dilate(img,kernel,iterations = 1) # 扩张,扩大白色部分,会放大噪点,但是会连接白色的损坏部分
img3 = cv.morphologyEx(img,cv.MORPH_OPEN,kernel) # 开运算,先侵蚀以去除噪点,再扩张,放大白色特征,还能在纤细处分离物体
img4 = cv.morphologyEx(img,cv.MORPH_CLOSE,kernel) # 闭运算,先扩张再侵蚀,填充物体内细小空间,连接邻近物体和平滑边界
img5 = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel) # 形态学梯度,用扩张减去侵蚀,即可得到边界范围
img6 = cv.tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)  #顶帽 ,输入图像和图像开运算之差,用于显示阴影区域
img7 = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel) # 黑帽,输入图像和图像闭运算之差,用于显示阴影区域cv.imshow("img",img)
cv.imshow("img1",img1)
cv.imshow("img2",img2)
cv.imshow("img3",img3)
cv.imshow("img4",img4)
cv.imshow("img5",img5)
cv.imshow("img6",img6)
cv.imshow("img7",img7)
cv.waitKey(0)
cv.destroyAllWindows()

img:
image

img1:
image

img2:
image

img4:
image

img5:
image

img6:
image
img7:

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

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

相关文章

结构开发笔记(七):solidworks软件(六):装配摄像头、摄像头座以及螺丝,完成摄像头结构示意图

前言摄像头装配机械机构动作,本篇就将之前的摄像头模块,摄像头底座和螺丝,进行装配摄像头。 装配过程步骤一:新建装配体再添加一次零件,因为有2个螺丝,然后固定底座:  步骤二:摄像头方块与底座匹配约束先对圆圈(这时候是同心圆):  再来一次,让两个面相切:  …

Unity网格编程学习(二)

目录1.创建平面2.创建立方体 1.创建平面定义平面的长、高,以及mesh的顶点、uv、法线 public int x = 3, y = 3; private Vector3[] vertices; private Vector2[] uvs; private Vector3[] normals;private void Start() {Mesh mesh = new Mesh();MeshFilter filter = this.GetC…

如何在极狐GitLab中添加 SSH Key?

本文分享如何生成 SSH Key 并添加到极狐GitLab 中,然后用 SSH Key 进行代码拉取。 **极狐GitLab 是 GitLab 在中国的发行版,可以一键私有化部署,对于中国开发者更友好。详细安装步骤可以查看官网 https://dl.gitlab.cn/xed81vsc **。 SSH Key 对于通过 ssh 来进行极狐GitLab…

python 十进制换为二进制 高位补零

参考:https://www.cnblogs.com/zy740/p/11904185.html python 十进制转换为二进制 高位补零a = 2b = {:08b}.format(a)输出结果为八位二进制,且高位补零若为a = 2b = {:8b}.format(a)输出结果为八位二进制,但高位不补零

vue3 常用的几种组件通讯方式

vue3 常用的几种组件通讯方式,大致如下Props/Emit Pinia 事件总线(mitt) Provide/Inject 浏览器本地存储 1. Props / Emit 注释:prop属性名称 / 方法名称的格式,采用 camelCase 与 kebab-case。1.1 props (1)上游组件设置 prop 值(通过 v-bind 或 冒号) 或者 (2)下…

巧手打字通-在线打字网站,终于来啦

儿子开信息课了,要练习电脑打字了 上个学期,上小学的孩子回家跟他妈妈说:“妈妈,我要学习打字,我们学校上信息课了。” 孩子妈妈听了这诉求,就把笔记本电脑拿了出来,打开了一个word文档,把电脑推到孩子面前,来,好好练习吧,加油! 过了十分钟,我来到孩子面前,看到了…

CentOS安装MySQL8教程

官方地址: https://dev.mysql.com/downloads/mysql/ 选择版本前需先看一下服务器的 glibc 版本 ldd --version上传 将下载好的 tar 包上传到服务器上,这里演示上传到了 /usr/local/ 文件夹下 (也可以自定义位置)解压 tar -Jxvf mysql-8.0.39-linux-glibc2.17-x86_64.t…

jQuery CSS 浏览器滚动到顶部固定左侧栏

<script>$(document).ready(function() {var div = $(#leftNav_2024925); // 替换为你的 div 的 IDvar divTop = div.offset().top; // 获取 div 顶部的位置$(window).scroll(function() {var scrollTop = $(this).scrollTop(); // 获取当前滚动条的位置if (scrollTop &g…

ProComponents——ProForm,设置初始值后,点击【重置】按钮,值已清除但页面未更新

我的问题 umi+antd,使用ProComponents的QueryFilter表单进行列表筛选,首页有个进入列表的快捷跳转,会筛选列表状态(在线1/离线0)。 设置筛选状态初始值为1后,点击【重置】按钮: 1.打印初始值1已清除,但页面上未更新,仍显示筛选在线状态 2.点击2次【重置】按钮,页面才…

Rust 中的关键字以及示例

Rust 中的关键字、保留字以及对应的示例1. 常见关键字as: 用于类型转换,例如将一个值从一种类型转换为另一种类型。let x: i32 = 42; let y: u8 = x as u8;break: 用于提前退出循环。for i in 0..10 {if i == 5 {break;} }const: 定义一个常量,常量的值在编译时就确定,不会在…

跨域——应对浏览器同源策略的一种方案

理解跨域,首先需要理解同源策略 (Same origin policy)。 何为源origin