OpenCV Python 图像处理入门

ops/2024/12/23 0:20:42/

OpenCV入门

OpenCV:轻量、高效、开源。最广泛使用的计算机视觉工具。

下面涉及图片的读取,RGB彩色通道,区域裁剪,绘制图形和文字,均值滤波,特征提取,模板匹配,梯度算法,阈值算法,形态学操作,摄像头读取。

  1. 第一个test01程序: 学习如何运行OpenCV的基本示例。
  2. 图像的彩色通道BGR: 了解OpenCV中图像颜色通道的表示方式。
  3. 图像的裁剪: 学习如何对图像进行裁剪操作。
  4. 绘制直线、矩形、圆形: 实践在图像上绘制基本图形。
  5. 均值滤波处理图像噪点: 使用均值滤波器去除图像噪声。
  6. 图像特征点的提取: 学习如何提取图像中的特征点。
  7. 模板匹配扑克牌上的菱形: 实现模板匹配技术。
  8. 图像的梯度算法与边缘检测: 探索图像梯度和边缘检测算法。
  9. 图像的二值化: 学习如何将图像转换为二值图像。
  10. 图像形态学之腐蚀和膨胀: 实践图像形态学操作。
  11. 调用电脑摄像头: 学习如何使用OpenCV捕获实时视频流。

1.第一个test01程序

import cv2
#查看cv2的版本
#print(cv2.__version__)
print(cv2.getVersionString())image = cv2.imread('opencv_logo.jpg')
#打印图片的维度(numpy)
print(image.shape)#显示图片
cv2.imshow('image', image)
cv2.waitKey(0)

结果:

 

2.图像的彩色通道BGR

图像的彩色通道,计算机对于图像色彩的描述,普遍使用了RGB3原色原理,也就是任何颜色都是由RGB,红绿蓝三种颜色按一定比例混合而成的。

对于open CV来说,存储一张彩色图片等同于存储三张灰度图,它们被存储在open CV图像数据的第三个维度上,灰度范围是零到255,OpenCV对颜色的存储顺序是BGR,与常见的RGB顺序刚好相反。当显示器需要渲染这张图片时,计算机会依次取出图像数据中的三张灰度图,再把它们分别投影到显示器的蓝色,绿色和红色的led芯片上。

import cv2
image = cv2.imread('opencv_logo.jpg')#BRG
cv2.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(0)

结果:

 3.图像的裁剪

import cv2image = cv2.imread('opencv_logo.jpg')
#裁剪图片
crop=image[10:170,40:200]
#打印裁剪的图片
cv2.imshow('crop',crop)
cv2.waitKey(0)

对于OpenCV索引的顺序是先横行后纵列,也就是说:索引10:170对应的是第10横行到第170,所以40:200对应的是第40,纵列到第200列。这个索引顺序与某些图像处理工具是不同的,比如加州理工大学基于MATLAB的图像处理工具包,就使用了相反的索引顺序。

结果:

 

4.绘制直线、矩形、圆形

OpenCV的图像数据实际上是numpy数组数据结构,所以可以直接使用number派创建一个黑色画布,具体代码如下:np.zeros维度300x300x3,灰度的数值类型是无符号八位整数nside integer eight,把创建的image变量显示出来,可以看到它是300×300的黑色画布。

import cv2
import numpy as np
image = np.zeros((300, 300, 3), np.uint8)#在画布上绘制直线
cv2.line(image, (100, 200), (250, 250), (250, 250, 0), 2)
#在画布上绘制矩形
cv2.rectangle(image, (30, 100), (60, 150), (0, 250, 0), 2)
#在画布上绘制圆形
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)
#在画布上绘制字符
cv2.putText(image,"hello",(100,50),0,1,(255,255,255),2)cv2.imshow("image",image)
cv2.waitKey(0)

结果:

5.均值滤波处理图像噪点

import cv2
image = 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(0)

结果:

 

6.图像特征点的提取

import cv2
image = cv2.imread('opencv_logo.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#获取图像中的特征点,最多返回500个点,点的质量优于0.1,特征点之间的距离大于十个像素
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('image', image)
cv2.waitKey(0)

结果:

 

7.模板匹配扑克牌上的菱形

目标是匹配扑克牌上的菱形,这张图片上一共有九个菱形,把它们都找出来。

import cv2
import numpy as np
image = cv2.imread('poker.jpg')
#把彩色图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#选取图像的一个区域作为匹配模板,使用索引横行75~105,纵列235~265,这个区域刚好包含一个菱形
template = gray[75:105,235:265]
#把带检测图像和模板都各自标准化,再来计算匹配度,这样可以保证匹配结果不受光照强度的影响
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
#找出匹配系数大于0.9的匹配点,再把模板图案的长和宽求出来
locations = np.where(match >= 0.9)
w,h = template.shape[0:2]
#循环遍历每一个匹配点,在原始图像上画出对应的矩形框,显示结果,9个菱形都被找到了。
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(0)

结果:

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

import cv2
#读取图像的灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
#拉普拉斯算子给出了图像明暗变化的趋势
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
#canny边缘检测
canny = cv2.Canny(gray, 100, 200)
cv2.imshow("gray", gray)
cv2.imshow("Laplacian", laplacian)
cv2.imshow("Canny", canny)
cv2.waitKey(0)

 结果:

9.图像的二值化(阈值:非黑即白)

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,2)
ret1,binary_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow('gray',gray)
cv2.imshow('binary',binary)
cv2.imshow('binary_adaptive',binary_adaptive)
cv2.imshow('binary_otsu',binary_otsu)
cv2.waitKey(0)

结果:

10.图像形态学之腐蚀和膨胀

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)
#腐蚀
erosion = cv2.erode(binary, kernel)
#膨胀
dilation = cv2.dilate(binary, kernel)
cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.waitKey(0)

结果:

 

11.调用电脑摄像头

import cv2
#电脑上只有一个摄像头,所以序号是零
capture = cv2.VideoCapture(0)
#对于摄像头的采集是连续不断的,也就是说要循环读取每一帧的画面,
# 由于不确定循环多少次,我们先让它做死循环
while True:ret, frame = capture.read()# 读取摄像头中的画面,把它展示出来cv2.imshow('frame', frame)key = cv2.waitKey(1)if key != -1:break
#释放指针
capture.release()

结果:


http://www.ppmy.cn/ops/95097.html

相关文章

[Qt][Qt窗口][上]详细讲解

目录 0.前言1.菜单栏0.是什么?1.创建菜单栏2.在菜单栏中添加菜单3.创建菜单项4.给菜单和菜单项设置快捷键5.在菜单项之间添加分割线6.给菜单和菜单项添加图标 0.前言 Qt窗⼝是通过QMainWindow类来实现的 QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类,继承…

ARM/Linux嵌入式面经(二四):国光电器

一面(群面) (1)常规的自我介绍 一个既专业又能够吸引面试官注意力的自我介绍模板如下。但是请根据自己的实际经历和技能进行适当调整和补充: 尊敬的面试官,您好!我是[您的姓名],非常荣幸有机会参加这次嵌入式系统工程师的面试。我毕业于[毕业院校],主修[专业名称],在…

Spring 02: Bean概览

Spring Bean是什么? 在 Spring 中,Bean 是一个由 Spring IoC(控制反转)容器管理的对象。Bean 通常通过在 XML 配置文件、Java 配置类或基于注解的方式定义,并由容器负责创建和配置。Spring 容器负责管理 Bean 的整个生…

Grafana 可视化监控和告警

前言 在现代分布式系统和云原生环境中,为了确保复杂的分布式系统和服务的高可用性、可靠性和性能,通常采用实时可视化监控和分析,实现故障快速响应、资源优化和安全保障,从而提升用户满意度和运营效率。 在目前主流的解决方案中…

这 2 个 GitHub 项目,YYDS!

01 🧠 构建你的第二大脑:SuperMemory 在这个信息爆炸的时代,我们每天都在互联网上浏览和保存大量的信息,但往往这些宝贵的数据就像被扔进了黑洞,再也没有被回顾和利用。 SuperMemory 开源项目应运而生,旨在…

C语言第20天笔记

文件操作 概述 什么是 文件 文件时保存在外存储器上(一般代指磁盘,也可以是U盘、移动硬盘等)的数据的集合。 文件操作体现在哪几个方面 1. 文件内容的读取 2. 文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&a…

微服务实战系列之玩转Docker(十)

前言 我们知道Docker的“使命”是为了快速完成应用的迁移和部署。为提升它的战斗能力,Docker官方携手发布了Docker Swarm—— 一个快速完成Docker集群构建的利器。那么请先回忆一下本系列第八篇(重点compose)和第九篇(重点networ…

MySQL 安装与配置指南

MySQL 是一种广泛使用的关系型数据库管理系统,为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL,以及如何进行基本的配置,以确保数据库系统的最佳性能和稳定性。 一、环境准备 1.1 系统要求 …