python-OpenCV-对图片进行操作

news2025/2/27 11:28:13

anaconda https://www.anaconda.com/download/

OpenCV拥有丰富的常用图像处理函数库

主要应用领域有计算机视觉领域:如物体识别、图像分割、人脸识别、动作识别及运动追踪

安装模块

pip install opencv-python
pip install opencv-contrib-python

一、cv2的基本方法和属性

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline	# 不用使用plt.show()就可以直接在页面展示出来

cv.imread(文件名,属性) 读入图像 - - - 属性值有IMREAD_COLOR(读入彩色)和IMERAD_GRAYSCALE(读入灰度图像)
文件名中不能有中文,会报错 - - - 将图片以array格式读出来 - - - 0~255,0最暗,255最亮 - - - 彩色是三维数组,灰度是二维数组

cv.imread('youling.png')

在这里插入图片描述
cv.imshow(窗口名,图像文件) 显示图像 - - - 彩色图像是BGR格式,使用matplotlib显示时需要转换为RGB格式

cv.waitKey() 等待时间 - - - 毫秒级,0表示任意键终止
键盘绑定函数,参数=0(或<0的数):一直显示窗口直到在键盘上按下一个键为止,并`返回按键对应的ASCII值``;参数>0:设置显示的时间单位为毫秒,超过这个指定的时间则返回-1

cv.destroyAllWindows(窗口名) 删除建立的窗口

cv.namedWindow(窗口名,属性) 创建一个窗口 - - - 属性值有WINDOW_AUTOSIZE(根据图像的尺寸自动创建),WINDOW_NORMAL(窗口大小可调整) - - - eg:cv.namedWindow(‘img’,cv.WINDOW_NORMAL)

img = cv.imread('youling.png',cv.IMREAD_COLOR)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

cv.imwrite(filename, imgdata) 保存图像

cv.imwrite('asd.jpg',img)
# True	# 将img保存为名为asd.jpg的图片

img.shape 图像的尺寸
彩色图片的返回值是(高, 宽, 3) - - - 灰度图片是(高, 宽)

img.shape
# (864, 1392, 3)	# 高 宽 3代表BGR

img.size 图像的大小

img.size
# 3608064	# 图片的高×宽×3  864*1392*3=3608064

可以通过k=cv.waitKey(0) 关闭图片或保存

img = cv.imread('youling.png',cv.IMREAD_COLOR)
cv.imshow('img',img)
k = cv.waitKey(0)
if k == 27:		# 如果按的是Esc键,退出
    cv.destroyAllWindows()
elif k == ord('s'):		# 按s键保存图片
    cv.imwrite('img.jpg',img)
    cv.destroyAllWindows()

将文字输入到照片中

cv.putText(图片名,文字,坐标,字体,字体大小,字体颜色,字体粗细)
字体的坐标是文字左下角的位置
字体可以选cv.FONT_HERSHEY_COMPLEX,cv.FONT_HERSHEY_COMPLEX_SMALL,cv.FONT_HERSHEY_DUPLEX,cv.FONT_HERSHEY_PLAIN等等

cv.putText(img,'hello world',(200,500),cv.FONT_HERSHEY_SIMPLEX, 15,(0,255,0),5)
cv.imshow('img',img)
k = cv.waitKey(0)
cv.destroyAllWindows()

二、cv2的图片处理

对图片进行缩放旋转仿射变换二值化

1.图片缩放 cv.resize()

cv.resize(图片,尺寸,插值算法) 支持多种插值算法,默认使用cv.INTER_LINEAR,缩小最适合cv.INTER_AREA,放大cv.INTER_CUBIC或cv.INTER_LINEAR

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

img = cv.imread('youling.png',cv.IMREAD_COLOR)
height,width,channel = img.shape
b,g,r = cv.split(img)		# 将img的三维数组变成GBR的二位数组
src = cv.merge([r,g,b])		# 在matplotlib里面展示需要变成rgb,但保存图片不用,现在保存图片R和B会互换
res = cv.resize(src,(2*width, 2*height),interpolation=cv.INTER_CUBIC)	# 这里是宽高
plt.subplot(121)		# 1行2列 第1张图
plt.imshow(src)			# 将数据显示为图像,即在二维正则光栅上显示
# plt.axis('off')		# 隐藏坐标轴
plt.subplot(122)
plt.imshow(res)
# plt.axis('off')
cv.imwrite('asd.jpg',res)	# 照片名字不能有中文 - - - 有中文不会报错,但保存不了照片
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

2.图片旋转 cv.getRotationMatrix2D()

需要构造一个旋转矩阵,可以通过cv.getRotationMatrix2D获得

M = cv.getRotationMatrix2D((cols/2, rows/2),45,0.6)
arg1:旋转中心 - - - arg2:旋转角度 - - - arg3:旋转后的缩放因子

img = cv.imread('youling.png',cv.IMREAD_COLOR)
rows,cols,ch = img.shape
b,g,r = cv.split(img)
src = cv.merge([r,g,b])
M = cv.getRotationMatrix2D((cols/2, rows/2),45,0.6)	# 旋转45度,并缩小为0.6倍
dst = cv.warpAffine(src,M,(cols,rows))	# 对图像应用仿射变换# DST输出阵列
plt.subplot(211)	# 2行1列 第1张图
plt.imshow(src)
plt.subplot(212)
plt.imshow(dst)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

3.图片仿射变换 cv.getAffineTransform()

在图像仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建偏移矩阵,需要在原图中找到3个点以及它们在输出图像中的位置

移动这3个点到其他位置

opencv中提供了cv.getAffineTransform() 创建2x3的矩阵,将矩阵传给参数cv.warpAffine()

img = cv.imread('youling.png',cv.IMREAD_COLOR)
rows,cols,ch = img.shape
b,g,r = cv.split(img)
src= cv.merge([r,g,b])
pts1 = np.float32([[100,100],[1000,0],[10,800]])
pts2 = np.float32([[100,100],[1000,100],[200,800]])
# 将图片(1000,0)的位置移动到(1000,100)的位置
M = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(src,M,(cols,rows))
plt.subplot(121),plt.imshow(src),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
# cv.waitKey(0)
# cv.destroyAllWindows()

在这里插入图片描述

4.图片二值化 cv.Threshold()

图片二值化是将图片上的像素点的灰度设置为0或255 - - - 将整个图片呈现出明显的黑白效果

有利于图片的进一步处理,数据量减小,能凸显出感兴趣目标的轮廓

cv.threshold(src,dst,threshold,maxValue,thresholdType) 实现对灰度图片进行阈值操作得到二值图像
src:原始数组 - - - dst:输出数组,必须与src的类型一致 - - - threshold:指定的分割阈值 - - - maxValue:使用CV_THRESH_BINARY和CV_THRESH_BINARY_INV的最大值

# 可以修改img_path的路径 - - - 将图片变成 灰度图片 和 黑白图片
img_path = 'youling.png'
img = cv.imread(img_path,cv.IMREAD_COLOR)
# cv.cvtColor()函数将图像转换为灰度,arg2:常量cv.COLOR_BGR2GRAY
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)	# 二维数组
cv.imshow('input',gray)	# 显示灰度图片,黑白灰
h,w = gray.shape[:2]
m = np.reshape(gray,[1,w*h])	# 将二维数组变成一维数组# array([[100,  98,  97, ...,  97, 100,  97]], dtype=uint8)
mean = m.sum() / (w*h)
print("mean:",mean)		# mean: 110.34934496727331
ret,binary = cv.threshold(gray,mean,255,cv.THRESH_BINARY)
cv.imshow('Binary',binary)	# 显示黑白图片
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

三、应用尺度不变特征变换

尺度不变特征变换(Scale-invariant Feature Transform,SIFT)是用于图像处理领域的一种局部特征检测算法

SIFT算法:

输入:原始图片
输出:图像的SIFT特征点
方法:
   1.使用高斯模糊滤波器以不同的比例模糊图片
   2.将模糊图像按滤波器的标准差加倍进行分组并差分它们
   3.在差分图像的标度上找到局部极值
   4.将与局部极值相关的每个像素与相同尺度和相邻尺度的相邻像素比较
   5.从比较中选择最大或最小值
   6.排除低对比度点
   7.插入候选关键点(图像特征)以获得原始图像上的位置

# 修改img_path的内容 - - - 找到图片的特征点
img_path = 'youling.png'
img = cv.imread(img_path,cv.IMREAD_COLOR)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d.SIFT_create()	# < cv2.SIFT 0000028440FF1910>	# cv2.SIFT
kp = sift.detect(gray,None)			# 找出关键点	# tuple
ret = cv.drawKeypoints(gray,kp,img)	# 三维数组,dtype=uint8	# numpy.ndarray
cv.imshow('SIFTKeyPiont',ret)
cv.waitKey(0)
cv.destroyAllWindows()
kp,des = sift.compute(gray,kp)		# 使用关键点找出sift特征向量
# des是二维数组,dtype=float32
print("特征点个数",np.shape(kp))
print("特征向量纬度",np.shape(des))
print("第一个关键点向量:\n",des[0])
特征点个数 (136,)
特征向量纬度 (136, 128)
第一个关键点向量:
 [ 17.   0.   0.   3.  12.   0.   0.   3. 187.   0.   0.   0.   0.   0.
   0.  75. 164.   1.   0.   0.   0.   0.   0.  40.   4.   1.   0.   0.
   0.   0.   0.   1.  38.   0.   0.   3.  12.   0.   0.   3. 187.   1.
   0.   0.   0.   0.   0.  46. 176.   4.   0.   0.   0.   0.   0.  16.
   5.   2.   0.   0.   0.   0.   0.   0.  44.   3.   0.   1.  12.   0.
   0.   1. 187.  21.   0.   0.   0.   0.   0.   8. 166.  10.   0.   0.
   0.   0.   0.   3.   4.   4.   1.   0.   0.   0.   0.   0.  27.   3.
   0.   1.  12.   1.   0.   0. 187.  44.   0.   0.   0.   0.   0.   0.
 137.  23.   0.   0.   0.   0.   0.   0.   4.   3.   0.   0.   0.   0.
   0.   0.]

在这里插入图片描述

四、使用加速鲁棒特征检测

五、图像降噪

噪声是数据和图像中的常见现象,减少数字图像中噪声的过程被称为图像降噪或图像去噪

平均小窗口中的像素值,即用像素周围邻域像素的平均值代替该像素值

opencv有一些去噪的函数,通常需要指定滤波器的强度、搜索窗口的大小和为检测相似性定义的窗口的大小

# 修改img_path的内容 - - - 图片降噪
img_path = 'youling.png'
img = cv.imread(img_path,cv.IMREAD_COLOR)
z = img.reshape((-1,3))# z是二维数组
np.random.seed(59)
noise = np.random.random(z.shape)<0.99
noisy = (z*noise).reshape((img.shape))# 为图片增加噪声
cv.imshow('noise',noisy)
cleaned = cv.fastNlMeansDenoisingColored(noisy,None,10,7,7,21)# 图片降噪
cv.imshow('denoised',cleaned)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【力扣周赛】第 113 场双周赛(贪心异或性质换根DP)

文章目录 竞赛链接Q1&#xff1a;8039. 使数组成为递增数组的最少右移次数竞赛时代码——枚举答案 Q2&#xff1a;2856. 删除数对后的最小数组长度竞赛时代码——贪心优先队列 Q3&#xff1a;6988. 统计距离为 k 的点对竞赛时代码——异或性质哈希表 Q4&#xff1a;100041. 可以…

【深度学习】Pytorch 系列教程(十):PyTorch数据结构:2、张量操作(Tensor Operations):(4)索引和切片详解

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 1. 数学运算 2. 统计计算 3. 张量变形 4. 索引和切片 使用索引访问单个元素 使用切片访问子集 使用索引和…

超级详细 SQL 优化大全

1、MySQL的基本架构 1&#xff09;MySQL的基础架构图 左边的client可以看成是客户端&#xff0c;客户端有很多&#xff0c;像我们经常你使用的CMD黑窗口&#xff0c;像我们经常用于学习的WorkBench&#xff0c;像企业经常使用的Navicat工具&#xff0c;它们都是一个客户端。右…

基于matlab实现的 BPSK调制AWGN通道未编码数据误码率程序

完整程序&#xff1a; clear; close all; clc; c0; rate1; %Code rate N10000000; %Number of bits for EbNoc0:1:10 %Ratio of bit energy to no…

gRpc_go_dart-1.编写第一个服务

​ 通俗的讲下grpc 简化掉所有复杂的实现,它要求服务端和客户端之间按照protobuf的规范进行数据交换,所以服务端和客户端都不用关心彼此的代码实现,只关心按照protobuf的形式提供数据 为什么是go和dart 技术栈,已经是google的形状了 同时,go客户端和Flutter间本身通过http…

05-Flask-Flask查询路由方式

Flask查询路由方式 前言命令行方式代码实现返回所有路由 前言 本篇来学习下Flask中查询路由的方式 命令行方式 # window 用set linux 用 export set FLASK_APPtest_6_flask运行发方式# 打印所有路由 flask routes代码实现返回所有路由 # -*- coding: utf-8 -*- # Time …

优质医疗机构网站模板源码(含手机端)基于pbootcms开源项目

模板名称&#xff1a; 基于pbootcms的医疗机构网站模板&#xff08;手机端优化&#xff09; 模板介绍&#xff1a; 这是一个使用PbootCMS内核开发的医疗机构网站模板&#xff0c;专为医疗机构和医疗保健类企业设计。该模板具有简洁、简单和易于管理的页面风格&#xff0c;并附…

征战开发板从无到有(三)

接上一篇&#xff0c;翘首已盼的PCB板子做好了&#xff0c;管脚约束信息都在PCB板上体现出来了&#xff0c;很满意&#xff0c;会不会成为爆款呢&#xff0c;嘿嘿&#xff0c;来&#xff0c;先看看PCB裸板美图 由于征战开发板电路功能兼容小梅哥ACX720&#xff0c;大家可以直…

数据结构---链表(java)

目录 1. 链表 2. 创建Node 3. 增加 4. 获取元素 5. 删除 6. 遍历链表 7. 查找元素是否存在 8. 链栈的实现 9. 链队的实现 1. 链表 数据存放在"Node"结点中 优点&#xff1a;不用考虑扩容和缩容的问题&#xff0c;实现了动态存储数据 缺点&#xff1a;没有…

SQLAlchemy Oracle Database 23c Free 集成之旅

SQLAlchemy & Oracle Database 23c Free 集成之旅 1. SQLAlchemy 是什么2. Oracle Database 23c Free 是什么3. 运行 Oracle Database 23c Free4. 学习 SQLAlchemy 统一教程4-1. 安装依赖库4-2. 建立连接 - 引擎4-3. 使用事务和 DBAPI4-3-1. 获取连接4-3-2. 提交更改4-3-3.…

git git fetch 和 git fetch origin master 的区别

git fetch 第1步 先读取 .git/config 配置 [remote origin]&#xff0c;若 fetch 并没有指定其中一个或多个远程仓库&#xff0c;就会处理所有的远程仓库 [remote “origin”]url gitgithub.com:kaku/testGit.gitfetch refs/heads/:refs/remotes/origin/第2步 git fetch 会…

Python 字符串的常用方法

视频版教程 Python3零基础7天入门实战视频教程 下标索引操作和前面的列表&#xff0c;元组用法一样。 虽然字符串不能被修改&#xff0c;但是返回一个操作过的新字符串&#xff0c;所以方法还不少。 我先学习下常用方法&#xff1b; 1&#xff0c;index(元素)方法&#xff0…

第三篇------Virtual I/O Device (VIRTIO) Version 1.1

上一篇文章链接https://blog.csdn.net/Phoenix_zxk/article/details/132921821 接下来续上 5.9.4 支持的加密服务 以下加密服务已定义&#xff1a; /* CIPHER 服务&#xff1a;用于加密解密操作 */ #define VIRTIO_CRYPTO_SERVICE_CIPHER 0 /* HASH 服务&#xff1a;用于哈…

【微信小程序】网络请求

环境&#xff1a;微信小程序开发工具 测试api&#xff08;随机获取猫咪靓照&#xff09;:https://api.thecatapi.com/v1/images/search?limit2 示例&#xff1a; 完整代码 request.wxml <button bind:tap"requestBtn" type"primary">网络请求&l…

基于SSM+Vue的校园活动管理平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【python之经验模态分解EMD实现】PyEMD库的安装和导入EMD, Visualisation问题解决方法[完整可运行]

现有的导入问题 目前网上的办法&#xff0c;直接导入&#xff1a;from PyEMD import EMD, Visualisation 是有问题的 可能会出现 在 ‘init.py | init.py’ 中找不到引用 ‘Visualisation’ 的报错。 原因似乎是现在导入的命令改了&#xff0c;这是一个坑&#xff0c;解决的…

数组相关面试题

1、原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N),空间复杂度为O(1)。 OJ链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 法1&#xff1a;挪到数据&#xff0c;思路如顺序表的头删&#xff0c;将后面的数据向前挪动将…

What does rail-to-rail mean (Rail-to-Rail Op amp) ?

What does rail-to-rail mean (Rail-to-Rail Op amp) ?

网络安全进阶学习第十九课——CTF之密码学

文章目录 一、密码学简介二、密码设计的根本目标三、古典密码1、摩斯密码CTF-题目展示 2、换位密码1&#xff09;栅栏密码2&#xff09;凯撒密码3&#xff09;曲路密码4&#xff09;列移位密码 3、替换密码1&#xff09;移位密码2&#xff09;简单替换密码3&#xff09;埃特巴什…

10 Ubuntu下配置STMCubeMX与CLion IDE联合环境搭建(不包含下载CLion的教程)

序言 果然作为一名测控系的学生&#xff0c;纯搞视觉多少还是有点与专业脱节&#xff0c;决定入坑嵌入式。选择STM32进行入门&#xff0c;并且使用CubeMX加CLion作为我的第一个真正意义上的嵌入式开发环境&#xff08;大一的时候玩过一段时间&#xff0c;但是没什么技术&#…