Day22 opencv图像预处理

图像预处理

在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,常见的操作包括图像空间转换、图像大小调整、图像仿射变换、图像翻转、图像裁剪、图像二值化处理、图像去噪、边缘检测、图像平滑处理和图像形态学等。

图像翻转

cv2.flip 是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。该函数接受两个参数:要翻转的图像和一个指定翻转类型的标志。示例代码展示了如何使用 cv2.flip 进行图像翻转。

import cv2

img = cv2.imread(r'C:\Users\My Documents\car.png')
#翻转 0:垂直翻转  1: 水平翻转  -1 是水平垂直翻转
f_img = cv2.flip(img,-1)

cv2.imshow("old",img)
cv2.imshow("new",f_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像仿射变换

仿射变换是一种线性变换,保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。通过 cv2.getRotationMatrix2D 和 cv2.warpAffine 函数,可以实现图像的旋转、平移和缩放等操作。

图像旋转

旋转操作可以将图像绕着某个点旋转一定的角度。通过 cv2.getRotationMatrix2D 计算旋转矩阵,并使用 cv2.warpAffine 进行旋转操作。

import cv2

img = cv2.imread("images/car.png")
#获取图片的像素
(h,w) = img.shape[:2]
#旋转的坐标
center =(100,120)
#旋转的角度
du = 30
#获取图像矩阵
m = cv2.getRotationMatrix2D(center,du,1)
#图像旋转
w_img=cv2.warpAffine(img,m,(w,h))
cv2.imshow("image",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像平移

平移操作可以将图像中的每个点沿着某个方向移动一定的距离。通过定义平移矩阵并使用 cv2.warpAffine 进行平移操作。

import cv2
import numpy as np
img = cv2.imread("images/car.png")
(h,w) = img.shape[:2]
#定义平移水平和垂直移动的距离
ty = 0
tx = 100
#创建一个平移矩阵
t_img = np.float32([[1,0,tx],[0,1,ty]])
#t_img = cv2.getRotationMatrix2D((tx,ty),-1,1)
w_img = cv2.warpAffine(img,t_img,(w,h))

cv2.imshow("m",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像缩放

缩放操作可以改变图像的大小。通过定义缩放因子并使用 cv2.warpAffine 进行缩放操作。

import cv2
import numpy as np
img = cv2.imread("images/car.png")
(h,w) = img.shape[:2]
print(h,w)
#定义缩放的参数, 缩放的参数大于1的是放大,小于1 的是缩小
ww = 0.5
hh = 0.5
m = np.float32([[ww,0,0],[0,hh,0]])
#仿射变化
t_img = cv2.warpAffine(img,m,(int(w*ww),int(h*hh)))
(h,w) = t_img.shape[:2]
print(h,w)
cv2.imshow("m",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像剪切

剪切操作可以改变图像的形状,使其在某个方向上倾斜。通过定义剪切因子并使用 cv2.warpAffine 进行剪切操作。

import cv2
import  numpy as np

img = cv2.imread("images/car.png")
(h,w) = img.shape[:2]
#定义图像剪切的参数
sx = 0.2
sy =0.1
#定义矩形
m = np.float32([[1,sx,0],[sy,1,0]])
#图像剪切
i_img = cv2.warpAffine(img,m,(w,h))
cv2.imshow("o",img)
cv2.imshow("a",i_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像色彩空间转换

OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。色彩空间转换在图像处理中非常重要,可以方便图像处理、提高图像处理效果和节省计算资源。

RGB 转 Gray(灰度)

将彩色图像转换为灰度图像,可以减少数据量并简化算法。通过 cv2.cvtColor 函数将图像从BGR转换为灰度图像。

import cv2

img = cv2.imread("images/car.png")
print(img)
#图像色彩空间转换
#opencv 默认的图像格式BGR
#COLOR_BGR2GRAY  把BGR图像转换成灰度图像
gay_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print("--------------------------------------")
print(gay_img)
cv2.imshow("old",img)
cv2.imshow("new",gay_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

RGB 转 HSV

HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。通过 cv2.cvtColor 函数将图像从BGR转换为HSV颜色空间。

图像二值化处理

cv2.threshold 是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。通过 cv2.threshold 函数可以将灰度图像转换为二值图像。

import cv2

img = cv2.imread("images/car.png")
#把图像转换成灰度图像
g_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化处理
#rs 实际应用阈值,t_img 转换后的图像
rs,t_img = cv2.threshold(g_img,150,255,cv2.THRESH_BINARY)
cv2.imshow("aa",img)
cv2.imshow("a",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像掩模

cv2.inRange 函数用于创建掩模,以便从图像中提取特定颜色的区域。通过定义颜色范围并使用 cv2.inRange 函数创建掩模。

import cv2
import numpy as np

img = cv2.imread(r'My Documents\car.png')
#把图像转换为HSV空间
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#获取蓝色所在范围
lower = np.array([101,100,50])
height = np.array([140,255,255])
#创建掩膜
mask = cv2.inRange(hsv_img, lower, height)
cv2.imshow('imp', img)
cv2.imshow('a', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

 图像位与操作

cv2.bitwise_and 是 OpenCV 库中的一个函数,用于对两个图像进行按位与操作。这个操作会逐个像素地对两个输入图像进行比较,只有在两个像素均为 255(白色)时,输出的像素才会为 255(白色),否则输出为 0(黑色)。

图像检测轮廓

cv2.findContours 函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。通过 cv2.findContours 函数查找轮廓,并通过 cv2.drawContours 函数绘制轮廓。

import cv2
import numpy as np
img =cv2.imread(r'C:\Users\My Documents\car.png')
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义颜色范围,(蓝色区域)
lower = np.array([100, 100, 100])
upper = np.array([140, 255, 255])
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
#二值化处理
ret,i_img = cv2.threshold(mask,120,255,cv2.THRESH_BINARY)
#获取图片的轮廓
myList,c = cv2.findContours(i_img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

num = len(myList)
print(f"长度={num}")
for c in myList:
    x,y,w,h = cv2.boundingRect(c)
    print(x,y,w,h )
    #画个矩形
    if w > 100 and h >45:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        #车牌切割
        qie_img = img[y:y+h,x:x+w]
cv2.imshow("a",qie_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

最小外接矩形

cv2.boundingRect 是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。

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

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

相关文章

LabVIEW for Linux 介绍

LabVIEW for Linux 介绍 1. 兼容性 LabVIEW for Linux 设计用于多种 Linux 发行版,包括 CentOS、Ubuntu 等。在安装之前,务必检查与您特定发行版版本的兼容性。 2. 程序移植 可移植性:在许多情况下,LabVIEW 程序(VI…

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作:点击按键和释放按键,也就是按键按下和松开。按键按下的对应的事件是KEYDOWN,按键松开对应…

递归到分治

一、递归与分治: 1、递归:如果一个问题分可以简化为某些更小的、更简单的子问题来解决,那么可以用递归 2、分治:如果想并行处理,可以用到分治 二、假设我们有一段文本,需要统计每个单词出现的频率。我们将…

数据结构(8.5_2)——基数排序

基数排序 第一趟“分配”:按"个位"进行分配 第一趟“收集”: 第二趟“分配”:按"十位"进行分配("个位"越大的越先入队) 第二趟“收集”: 第三趟“分配”:按"百位"进行分配(&…

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…

漫途焊机安全生产监管方案,提升安全生产管理水平!

随着智能制造时代的到来,企业安全生产管理的重要性日益凸显。特别是在现代工厂中,焊机的安全生产监管成为了一个不容忽视的重要环节。传统的焊机安全生产监管方式存在诸多不足,如人工巡检频率低、数据延迟、安全隐患发现不及时等问题。因此&a…

《Linux系统编程篇》管道(Linux 进程间通信(IPC))——基础篇

文章目录 引言理解 Linux 进程间通信(IPC)基础什么是进程间通信(IPC)? 管道(Pipe)的基本介绍使用场景:管道特点:管道类型:匿名管道命名管道(FIFO&…

阿拉伯国家本地化测试的特点

针对阿拉伯国家的应用程序的本地化测试需要详细了解语言、文化背景、地区规范和技术细节,以符合阿拉伯语用户的期望。这些国家包括沙特阿拉伯、阿拉伯联合酋长国、科威特、卡塔尔、巴林和阿曼,具有独特的语言和文化因素,成功地本地化测试解决…

报错:npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

报错场景 使用npm run dev 报错 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 npm…

RabbitMQ的路由模式

路由模式 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须指定消息的 RoutingKey Exchange 不再把消息交给每一个绑定的队列,而是…

FastAPI性能对比:同步vs异步

大家好,FastAPI已成为构建Python API的最流行框架之一,因其速度和易用性而广受欢迎。但在构建高性能应用程序时,使用同步(sync)还是异步(async)代码执行是很重要的问题。本文将通过现实世界的性…

diffusion model 学习笔记

条件引导的 diffusion 对于无条件的DDPM 而言 p ( x t ∣ x 0 ) ∼ N ( α t ˉ x 0 , 1 − α t ˉ ⋅ I ) p(x_t | x_0) \sim \mathcal{N}( \sqrt{\bar{\alpha_t}} x_0, 1-\bar{\alpha_t} \cdot \mathrm{I} ) p(xt​∣x0​)∼N(αt​ˉ​ ​x0​,1−αt​ˉ​⋅I) 可以得到…

3.4 大数据生态

文章目录 1. 数据存储1.1 Apache Hadoop - HDFS1.2 Apache HBase1.3 Apache Kudu1.4 云平台存储组件 2. 数据计算2.1 Apache Hadoop - MapReduce2.2 Apache Hive2.3 Apache Spark2.4 Apache Flink 3. 数据传输3.1 Apache Kafka3.2 Apache Pulsar3.3 Apache Flume3.4 Apache Sqo…

Community Enterprise Operating System

起源与背景 CentOS项目始于2003年,由一群热心的Linux用户和开发者共同发起。 它的诞生旨在为用户提供一个免费且与RHEL高度兼容的操作系统,满足那些希望使用RHEL的稳定性和安全性但又不想支付商业许可费用的用户和组织的需求。 CentOS社区会将Red Hat…

论文精读:PRL RuO2中不存在交错磁自旋分裂

Phys. Rev. Lett., 2024, 133, 176401. https://doi.org/10.1103/PhysRevLett.133.176401 https://mp.weixin.qq.com/s/Miv6kvT5vh-Sha1xP38YLQ 摘要节选 金红石RuO2被认为是一种潜在的d波交变磁候选材料,预测自旋分裂高达1.4 eV。尽管积累了理论预测和输运测量…

【GIN】go-gin 中 validator 验证功能

文章目录 前言一、基础用法二、常用字段说明常用字段说明1. required2. len3. min 和 max4. gte 和 lte 、 gt 和 lt 、ne5. oneof6. email7. url 三、示例代码运行效果 总结 前言 在 Go 中使用 Gin 框架时,BindJSON 可以将 JSON 请求体中的数据绑定到结构体上&…

[ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

RSTP的工作过程

RSTP简介: 生成树协议(STP)用于在网络中防止环路产生,但 STP 的收敛速度较慢。 RSTP(Rapid Spanning Tree Protocol )快速生成树协议:RSTP 是对 STP 的改进,它能在网络拓扑发生变化…

HTML 结构化标签完全指南:<html>、<head>、<body> 和布局标签 <div>、<span> 的功能及其在网页中的应用

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

php把十六进制转化成字符串 和 字符串转十六进制

最近项目中碰到需要把接收十六进制的数据&#xff0c;十六进制的数据不便阅读 方法一&#xff0c;只是不同的函数 // 十六进制转字符串 function hexToStr($hex) {$hex str_replace( , , $hex); // 去除空格$string ;for ($i 0; $i < strlen($hex) - 1; $i 2) {$st…