OpenCV基础(一)

news2025/1/29 14:09:57

1.认识图像(彩色图中每一个像素点都包含三个颜色通道RGB,数值范围为0~255,0代表黑色,255代表白色)

import cv2 #opencv 读取的格式为BGR

img = cv2.imread('cat.png') #读取图像
cv2.imshow('cat', img) #显示图像img,窗口名为cat
cv2.waitKey(0) #显示并停留
print(img)
print(img.shape) # h*w*c (432, 650, 3),此时有三个通道
print(len(img))  #高
print(len(img[0]))  #宽
print(len(img[0][0])) #RGB

程序一旦停止运行,图片就不会展示了,所以会出现一闪而过的窗口展示,为了让图片长时间展示出来,需要加:cv2.waitKey(0)

print(img):(输出三维列表:最外维度是高,中间维度是宽,最里面的维度是RGB

[[[ 14  24  11]
  [ 14  24  11]
  [ 14  24  12]
  ...
  [  3  26  12]
  [  3  29  13]
  [  3  30  14]]

 [[ 14  24  11]
  [ 14  24  11]
  [ 13  23  11]
  ...
  [  2  25  11]
  [  3  29  13]
  [  3  30  14]]

 [[ 14  24  12]
  [ 14  24  12]
  [ 13  23  11]
  ...
  [  3  23  10]
  [  5  28  13]
  [  4  30  14]]

 ...

 [[ 38 137 121]
  [ 36 135 119]
  [ 36 134 118]
  ...
  [ 35 125 106]
  [ 36 125 106]
  [ 36 125 106]]

 [[ 39 138 122]
  [ 37 136 120]
  [ 37 135 119]
  ...
  [ 35 124 105]
  [ 35 124 105]
  [ 35 124 105]]

 [[ 40 139 123]
  [ 38 137 121]
  [ 38 136 120]
  ...
  [ 35 124 105]
  [ 35 124 105]
  [ 35 124 105]]]

print(len(img)) & print(leg(img[0])) & print(leg(img[0][0])) & print(img.shape):

432
650
3
(432, 650, 3)

2.读取灰度图

彩色图到灰色图的转化公式:B × 0.114 + G × 0.587 + R × 0.299 

例:14×0.114+24×0.587+11×0.299=18.973(向下取整)

        14×0.114+24×0.587+12×0.299=19.272(向下取整)

import cv2 #opencv 读取的格式为BGR

# 读取灰度图
img = cv2.imread('cat.png', cv2.IMREAD_GRAYSCALE) #cv2.IMREAD_GRAYSCALE表示读取灰度图

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留
cv_show('cat',img) #封装起来,只需传入窗口名和待显示图像
print(img.shape) # h*w (432, 650),此时只有一个通道

#图像保存,将图片img保存在当前目录,名为cat2.png
cv2.imwrite('cat2.png', img)

print(img) & print(img.shape): 

[[ 18  18  19 ...  19  21  22]
 [ 18  18  18 ...  18  21  22]
 [ 19  19  18 ...  16  20  22]
 ...
 [120 118 118 ... 109 109 109]
 [121 119 119 ... 108 108 108]
 [122 120 120 ... 108 108 108]]
(432, 650)

 3.图像截取

 

img2 = cv2.imread('cat.png') #读取图像
img3 = img2[0:200, 0:300] #高200像素,宽300像素

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留

cv_show('cat',img3)
print(img3.shape) #(200, 300, 3)

3.1通道提取

img2 = cv2.imread('cat.png') #读取图像

#只保留R通道,令B,G通道都为0,其他同理
img2[:,:,0]=0
img2[:,:,1]=0

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留

cv_show('cat',img2)

4.图像融合

img2 = cv2.imread('cat.png') #读取图像
img3 = img2 + 10
print(img2[0:2,0:2,:]) #为了方便观察,只打印前两行两列的数值
print(img3[0:2,0:2,:])

可以看出在每个像素点的每个通道上都+10 

[[[14 24 11]
  [14 24 11]]

 [[14 24 11]
  [14 24 11]]]
[[[24 34 21]
  [24 34 21]]

 [[24 34 21]
  [24 34 21]]]

如果大于255怎么办,会自动溢出:14+250-256=8,24+250-256=18...

img2 = cv2.imread('cat.png') #读取图像
img3 = img2 + 250
print(img2[0:2,0:2,:]) #为了方便观察,只打印前两行两列的数值
print(img3[0:2,0:2,:])
[[[14 24 11]
  [14 24 11]]

 [[14 24 11]
  [14 24 11]]]
[[[ 8 18  5]
  [ 8 18  5]]

 [[ 8 18  5]
  [ 8 18  5]]]

5.腐蚀与膨胀 

原图
腐蚀
膨胀
开运算
闭运算
import cv2 #opencv 读取的格式为BGR
import numpy as np

img = cv2.imread('j.png') #读取图像
kernel = np.ones((5,5), np.uint8) #设置锚框(核)大小

img2 = cv2.erode(img, kernel) #erode为腐蚀操作
img2 = cv2.dilate(img, kernel) #dilate为膨胀操作

img2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) #开运算
img2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) #闭运算

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留
cv_show('j', img2) 

腐蚀:将锚框(核)区域中最小的值赋值给锚点,即将(0,0,0)像素值赋值给锚点,故腐蚀后黑色区域增加,白色区域减少;

膨胀:将锚框(核)区域中最大的值赋值给锚点,即将(255,255,255)像素值赋值给锚点,故膨胀后白色区域增加,黑色区域减少;

开运算:先腐蚀,再膨胀;闭运算:先膨胀,再腐蚀。

5.1梯度计算

膨胀-腐蚀
梯度运算

 梯度计算 = 膨胀 - 腐蚀

import cv2 #opencv 读取的格式为BGR
import numpy as np

img = cv2.imread('j.png') #读取图像

kernel = np.ones((5,5), np.uint8)

# imgP = cv2.erode(img, kernel) #膨胀
# imgF = cv2.dilate(img, kernel) #腐蚀
# img2 = imgF - imgP #膨胀-腐蚀

img2 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) #梯度运算

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留
cv_show('j', img2) 

 6.Soble算子(边缘检测)

Soble卷积因子
dx方向
dy方向
dx,dy合并
import cv2 #opencv 读取的格式为BGR
import numpy as np

img = cv2.imread('j.png') #读取图像

imgx = cv2.Sobel(img, cv2.CV_64F, 1, 0, 3) #cv2.CV_64F为更高的数据类型,dx=1,dy=0,ksize=3
imgx = cv2.convertScaleAbs(imgx) #将负值转化为绝对值

imgy = cv2.Sobel(img, cv2.CV_64F, 0, 1, 3) #cv2.CV_64F为更高的数据类型,dx=0,dy=1,ksize=3
imgy = cv2.convertScaleAbs(imgy) #将负值转化为绝对值

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留
cv_show('j', imgx) 
cv_show('j', imgy) 

#同时在x,y方向上Soble
imgx_y = cv2.addWeighted(imgx, 0.5, imgy, 0.5, 0) #0.5为权重,0为偏置
cv_show('j', imgx_y) 

 Scharr算子(用法和Soble一样)

scharr算子卷积因子
dx方向
dy方向
dx,dy合并
import cv2 #opencv 读取的格式为BGR
import numpy as np

img = cv2.imread('j.png') #读取图像

imgx = cv2.Scharr(img, cv2.CV_64F, 1, 0, 3) #cv2.CV_64F为更高的数据类型,dx=1,dy=0,ksize=3
imgx = cv2.convertScaleAbs(imgx) #将负值转化为绝对值

imgy = cv2.Scharr(img, cv2.CV_64F, 0, 1, 3) #cv2.CV_64F为更高的数据类型,dx=0,dy=1,ksize=3
imgy = cv2.convertScaleAbs(imgy) #将负值转化为绝对值

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留
cv_show('j', imgx) 
cv_show('j', imgy) 

#同时在x,y方向上Soble
imgx_y = cv2.addWeighted(imgx, 0.5, imgy, 0.5, 0) #0.5为权重,0为偏置
cv_show('j', imgx_y) 

 Laplace算子

Laplace算子卷积因子
Laplace算子边缘检测
import cv2 #opencv 读取的格式为BGR
import numpy as np

img = cv2.imread('j.png') #读取图像

img2 = cv2.Laplacian(img, cv2.CV_64F, 3) #不需要设置dx,dy
img2 = cv2.convertScaleAbs(img2)

def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
    cv2.imshow(name, img)
    cv2.waitKey(0) #显示并停留

cv_show('j', img2) 

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

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

相关文章

Matlab实现FFT变换

Matlab实现FFT变换 文章目录Matlab实现FFT变换原理实现手算验证简单fft变换和频谱求取功率谱结论在信号处理中,快速傅里叶变换(FFT)是一种非常常见的频域分析方法。本文将介绍如何使用Matlab实现FFT变换,并通过Matlab代码演示实际…

SAP ABAP 深度解析Smartform打印特殊符号等功能

ABAP 开发人员可以在 Smartform 输出上显示 SAP 图标或 SAP 符号。例如,需要在 SAP Smart Forms 文档上显示复选框形状的输出。SAP Smartform 文档上可以轻松显示空复选框、标记复选框以及 SAP 图标等特殊符号。 在 SAP Smartform 文档中添加一个新的文本节点。 1. 单击“更…

开发一款系统软件的流程步骤是什么

在如今的数字化时代,软件开发成为了一个重要的行业。无论是大型企业还是小型创业公司,软件开发都是不可或缺的一环。在本文中,我将介绍一些网上常见的软件开发步骤,以便开发者能够更好地理解和实践。1、需求分析需求分析是开发系统…

基于transformer的多帧自监督深度估计 Multi-Frame Self-Supervised Depth with Transformers

Multi-Frame Self-Supervised Depth with Transformers基于transformer的多帧自监督深度估计0 Abstract 多帧深度估计除了学习基于外观的特征外,也通过特征匹配利用图像之间的几何关系来改善单帧估计。我们采用深度离散的核极抽样来选择匹配像素,并通过一…

基于Jeecgboot前后端分离的ERP系统开发代码生成(六)

商品信息原先生成的不符合要求,重新生成,包括一个附表商品价格信息表 一、采用TAB主题一对多的模式 因为主键,在online表单配置是灰的,所以不能进行外键管理,只能通过下面数据库进行关联录入,否则online界面…

案例19-遇见问题的临时解决方案和最终解决方案

目录1、背景介绍2、两种解决方案的概念1、临时解决方案:2、最终解决方案:3、排查问题过程4、总结站在用户的角度思考作为软件开发者5、升华1、背景介绍 首先说明这是系统很早之前的时候的一个功能,当时和学习通还有很强的耦合关系。在学习通…

研究链表空间销毁问题

💯💯💯 1.研究链表空间销毁问题 当链表使用完后,需要将链表销毁,那么该如何销毁呢? void SLTDestroy(SLTNode* phead)//销毁单链表 {SLTNode* cur phead;while(cur){free(cur);cur cur->next;} }你…

Linux下Nginx安装使用

一、下载解压nginx # 进入要放安装包的目录 cd /opt/software # 下载安装包 wget https://nginx.org/download/nginx-1.20.2.tar.gz # 解压缩 tar -zxvf nginx-1.20.2.tar.gz -C /opt/modules # 进入解压后的目录 cd /opt/modules/nginx-1.20.2/二、安装nginx 1、安装编译器 …

剑指 Offer II 021. 删除链表的倒数第 n 个结点

题目链接 剑指 Offer II 021. 删除链表的倒数第 n 个结点 mid 题目描述 给定一个链表,删除链表的倒数第 n个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: …

MySQL的多表操作

多表关系 介绍 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、 订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习…

DolphinDB 机器学习在物联网行业的应用:实时数据异常率预警

数据异常率预警在工业安全生产中是一项重要工作,对于监控生产过程的稳定性,保障生产数据的有效性,维护生产设备的可靠性具有重要意义。随着大数据技术在生产领域的深入应用,基于机器学习的智能预警已经成为各大生产企业进行生产数…

logback无法删除太久远的日志文件?logback删除日志文件源码分析

logback无法删除太久远的日志文件?logback删除日志文件源码分析 最近发现logback配置滚动日志,但是本地日志文件甚至还有2年前的日志文件,服务器是却是正常的! 网上搜索了一波没有发现,只找到说不能删除太久远的旧日志…

Leetcode. 21 合并两个有序列表

尾插 核心思路:依次比较 ,取经过比较后较小值进行尾插 cur1 指向list1 ,cur 2指向list2 ,当cur1走完list1 或者cur2 走完list2 后停止 如果cur1走完list1 ,可以将cur2 整个拿下来尾插 如果cur2走完list2 ,可以将cur1 整个拿下来尾插 特殊情况 &#xff1…

c# 32位程序突破2G内存限制

起因 在开发过程中,由于某些COM组件只能在32位程序下运行,程序不得不在X86平台下生成。而X86的32位程序默认内存大小被限制在2G。由于程序中可能存在大数量处理,期间对象若没有及时释放或则回收,内存占用达到了1.2G左右&#xff…

瀑布开发与敏捷开发的区别,以及从瀑布转型敏捷项目管理的5大注意事项

事实证明,瀑布开发管理模式并不适合所有的软件项目,但敏捷项目管理却对大多数项目有效。那么当团队选择转型敏捷的时候有哪些因素必须注意?敏捷开发最早使用者大多是小型、独立的团队,他们通常致力于小型、独立的项目。正是他们的…

Keepalive+LVS群集部署

KeepaliveLVS群集部署一、Keepalive概述1、什么是Keepalive2、Keepalive工作原理3、Keepalive主要模块及作用4、Keepalived 服务重要功能(1)管理 LVS 负载均衡软件(2)支持故障自动切换(3)实现 LVS 负载调度…

SpringBoot下的Spring框架学习(tedu)——day03——Spring DI、SpringAOP JDK动态代理

SpringBoot下的Spring框架学习(tedu)——day03——Spring DI、SpringAOP JDK动态代理 目录SpringBoot下的Spring框架学习(tedu)——day03——Spring DI、SpringAOP JDK动态代理1. Spring的依赖注入1.1 依赖注入案例1.1.1 定义接口…

Python的运算符

Python支持多种运算符,下表大致按照优先级从高到低的顺序列出了所有的运算符,运算符的优先级指的是多个运算符同时出现时,先做什么运算然后再做什么运算。除了我们之前已经用过的赋值运算符和算术运算符,我们稍后会陆续讲到其他运…

解决launch:program .exe does not exist

二. 程序的运行和调试 1.launch.json 复制下列代码至launch.json,并根据指导做出相对/绝对路径修改 用 IntelliSense 了解相关属性。 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.micros…

虹科教您 | 在Linux环境下安装PCAN View及通讯测试指南

应用简介 PCAN-View软件是一款简化的CAN监视软件,可用于显示、发送、和记录CAN数据通讯。报文可手动和定期发送,用户可设置比特率。在处理期间显示总线系统错误和CAN硬件的存储器过满。示踪功能可用于记录和保存CAN数据通讯。本文档的作用在于&#xff…