当前位置: 首页 > news >正文

【OpenCV】 Python 图像处理 入门

参考:

GitHub - kongfanhe/opencv_tutorial 

OpenCV Python 图像处理 30分钟 入门课程_哔哩哔哩_bilibili

OpenCV的基本示例

# 基本IO
import cv2
# 读取版本号
print(cv2.getVersionString())
# 读取图片
image = cv2.imread("opencv_logo.jpg")
# 打印图片的形状(高度,宽度,通道数)
print(image.shape)cv2.imshow("image", image)
cv2.waitKey()  # 让窗口暂停

图像的彩色通道BGR

# 图像的颜色
import cv2image = cv2.imread("opencv_logo.jpg")
# 颜色通道顺序:BGRcv2.imshow("blue", image[:, :, 0])
cv2.imshow("green", image[:, :, 1])
cv2.imshow("red", image[:, :, 2])# 彩色图片灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)cv2.waitKey()

图像的裁剪

# 图像裁剪操作
import cv2image = cv2.imread("opencv_logo.jpg")crop = image[10:170, 40:200]cv2.imshow("crop", crop)
cv2.waitKey()

绘制直线、矩形、圆形

# 实现绘图功能
import cv2
import numpy as np# 创建黑色画布
image = np.zeros([300, 300, 3], dtype=np.uint8)# 绘制线段(对象, 起点, 终点, 颜色, 粗细)
cv2.line(image, (100, 200), (250, 250), (255, 0, 0), 2)
# 绘制矩形(~,起点, 对角点, 颜色, 粗细)
cv2.rectangle(image, (30, 100), (60, 150), (0, 255, 0), 2)
# 绘制圆形(~,圆心, 半径, 颜色, 粗细)
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)
# 绘制字符串(~, 内容, 坐标, 字体格式序号, 缩放系数, 颜色, 粗细, 线条类型序号)
cv2.putText(image, "hello", (100, 50), 0, 1, (255, 255, 255), 2, 1)cv2.imshow("image", image)
cv2.waitKey()

均值滤波处理图像噪点

# 图形的滤波
import cv2image = cv2.imread("plane.jpg")
# 使用高斯滤波器
gauss = cv2.GaussianBlur(image, (5, 5), 0)
# 使用均值滤波器
median = cv2.medianBlur(image, 5)cv2.imshow("image", image)
cv2.imshow("gauss", gauss)
cv2.imshow("median", median)cv2.waitKey()'''
高斯滤波(Gaussian Blur)和均值滤波(Mean Blur)都是图像处理中常用的平滑技术,它们用于减少图像噪声、模糊图像边缘或细节,以及进行图像预处理。
选择使用哪种滤波方法取决于具体的应用场景和需求。均值滤波:
简单易实现,对所有像素的邻域内的像素值求平均。
对于去除随机噪声(如椒盐噪声)效果较好。
对图像的边缘和细节的模糊程度较高,可能导致图像质量下降。高斯滤波:
使用高斯分布作为权重,对邻域内的像素进行加权平均。
对图像的边缘和细节的模糊程度较低,通常能更好地保留图像的结构信息。
实现相对复杂,需要计算高斯核的权重。在实际应用中,高斯滤波通常更受欢迎,因为它在平滑图像的同时能更好地保留图像的边缘和细节。
然而,如果处理速度是一个关键因素,均值滤波由于其简单性可能会更快。此外,对于某些特定的噪声类型,均值滤波可能更有效。在决定使用哪种滤波方法时,可以考虑以下因素:
图像内容:如果图像中包含重要的边缘信息,高斯滤波可能更合适。
噪声类型:如果主要是随机噪声,均值滤波可能更有效。
实现复杂度:如果需要快速实现,均值滤波可能更简单。
性能要求:如果对图像质量有较高要求,高斯滤波通常能提供更好的结果。在某些情况下,也可以结合使用这两种滤波方法,或者尝试其他类型的滤波器,如双边滤波(Bilateral Filter),它在平滑图像的同时能更好地保留边缘。
'''

图像特征点的提取

# 图片特征的提取
import cv2image = cv2.imread("opencv_logo.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 图片先灰度化# 获取特征点 (对象, 最多的点数, 质量优度水平, 特征点之间的最小距离)
corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10)
# 标记出每个点
for corner in corners:x, y = corner.ravel()cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)cv2.imshow("corners", image)
cv2.waitKey()
# 可以发现,特征点主要都在图片的转角处

模板匹配扑克牌上的菱形

# 图片的模板匹配(以匹配扑克牌上的菱形为例)
import cv2
import numpy as npimage = cv2.imread("poker.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 选取匹配模板
template = gray[75:105, 235:265]# 使用标准相关匹配算法——将待检测对象和模板都标准化再来计算匹配度
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
locations = np.where(match >= 0.9)  # 找出匹配系数大于0.9的匹配点w, h = template.shape[0:2]
for p in zip(*locations[::-1]):  # 循环遍历每一个匹配点并画出矩形框标记x1, y1 = p[0], p[1]x2, y2 = x1 + w, y1 + hcv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.imshow("image", image)
cv2.waitKey()

图像的梯度算法与边缘检测

# 图像的梯度(明暗变化)
import cv2gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)  # 直接读取为灰度图# 使用拉普拉斯算子(检测边缘——梯度剧烈变化处)
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
# canny边缘检测(定义边缘为梯度区间)
# 梯度大于200 -> 变化足够强烈,确定是边缘
# 梯度小于100 -> 变化较为平缓,确定非边缘
# 梯度介于二者之间 -> 待定,看其是否与已知的边缘像素相邻
canny = cv2.Canny(gray, 100, 200)cv2.imshow("gray", gray)
cv2.imshow("laplacian", laplacian)
cv2.imshow("canny", canny)cv2.waitKey()

图像的二值化

# 图片的阈值算法(二值化,将连续的灰度范围切割为白+黑)
import cv2# 图片灰度二值化
gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE)
ret, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)
# 图片自适应二值化(划分区块二值化,效果更好)
binary_adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
# 大津算法(基于图片灰度聚类分析,自定义阈值)
ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)cv2.imshow("gray", gray)
cv2.imshow("binary", binary)
cv2.imshow("adaptive", binary_adaptive)
cv2.imshow("otsu", binary_otsu)
cv2.waitKey()# ret/ret1是一个浮点数,表示图像中像素值的阈值
print(ret)
print(ret1)

图像形态学之腐蚀和膨胀

# 图像的形态学算法(腐蚀和膨胀)
import cv2
import numpy as np# 在腐蚀和膨胀之前需要先将图片二值化
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)  # 使用反向阈值——背景白色,图案黑色
kernel = np.ones((5, 5), np.uint8)  # 操作需要用到的kernel# 腐蚀和膨胀操作
erosion = cv2.erode(binary, kernel)
dilation = cv2.dilate(binary, kernel)cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)cv2.waitKey()

调用电脑摄像头

# opencv调用电脑中的摄像头
import cv2# 获取摄像头设备的指针(设备管理器 -> 照相机)
capture = cv2.VideoCapture(0)
ret = True# 摄像头的读取是连续不断的,需要循环读取
while ret:ret, frame = capture.read()'''ret:这是一个布尔值,表示读取操作是否成功。如果 ret 为 True,表示成功读取了一帧图像;如果为 False,则表示读取失败,可能是因为视频流结束或者其他错误。在处理视频流时,这个返回值通常用于控制循环,直到视频流结束。frame:这是一个NumPy数组,代表了从视频捕获对象读取的当前帧。这个数组通常是一个三维的,其形状为 (高度, 宽度, 通道数),其中通道数可以是1(灰度图像)或3(彩色图像,分别对应红、绿、蓝通道)。'''cv2.imshow("camera", frame)key = cv2.waitKey(1)  # 等待键盘输入1msif key != -1:  # 按任意键跳出循环breakcapture.release()  # 释放指针

相关文章:

  • vscode 顶部 Command Center,minimap
  • php中根据指定日期获取所在天,周,月,年的开始日期与结束日期
  • C# ReoGrid使用记录
  • 阿里云服务器操作系统 Alibaba Cloud Linux 全新升级,核心场景性能提升超 20%
  • 学习react小记
  • Easy Excel从入门到精通!!!
  • IP与网关的关系
  • 免杀笔记 ---> 无痕Hook?硬件断点 Syscall!
  • C语言中的栈
  • 华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)
  • 一文把数据架构讲明白
  • HTML5实现好看的唐朝服饰网站模板源码2
  • vue创建
  • 软件设计——随手笔记
  • ARM硬件知识补充
  • [nginx文档翻译系列] 控制nginx
  • android 一些 utils
  • input的行数自动增减
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • java正则表式的使用
  • leetcode386. Lexicographical Numbers
  • nodejs:开发并发布一个nodejs包
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows-nginx-https-本地配置
  • 测试开发系类之接口自动化测试
  • 从零开始在ubuntu上搭建node开发环境
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端代码风格自动化系列(二)之Commitlint
  • 听说你叫Java(二)–Servlet请求
  • 一、python与pycharm的安装
  • 正则与JS中的正则
  • 湖北分布式智能数据采集方法有哪些?
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​插件化DPI在商用WIFI中的价值
  • # Apache SeaTunnel 究竟是什么?
  • #DBA杂记1
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (java)关于Thread的挂起和恢复
  • (第二周)效能测试
  • (二)windows配置JDK环境
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)80c52学习之旅-起始篇
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 设计模式初探
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net中wcf服务生成及调用
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .stream().map与.stream().flatMap的使用
  • @Transactional 竟也能解决分布式事务?
  • [android] 手机卫士黑名单功能(ListView优化)