OpenCV Python 图像处理入门

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 cv2

image = 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 + h
    cv2.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()

结果:

相关推荐
不如语冰22 分钟前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~33 分钟前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬35 分钟前
统计verilog .v文件中output 的bit数
python
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
爱吃提升1 小时前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
审小匠OpenCPAi1 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
元Y亨H2 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
金銀銅鐵3 小时前
[Python] 用 turtle 来绘制瑞典国旗
python
Albert Edison3 小时前
【GUI 自动化测试】Pywinauto 常见操作
自动化测试·python·pywinauto
海兰3 小时前
【高速缓存】RedisVL为文本生成嵌入向量实践指南
人工智能·python·机器学习