【计算机视觉OpenCV基础】实验一 图像预处理

news2024/11/27 18:41:28

实验一 图像预处理

计算机视觉OpenCV基础实验合辑(实验1234+扩展)
资源下载地址: https://download.csdn.net/download/weixin_53403301
合辑:(加在下载地址后面)
/87113581
讲义(包括理论、图例、PPT、实验、代码、手册):(加在下载地址后面)
/87113633

matplotlib中载入中文字体

plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体

实验目的:
1、 学习并初步掌握OpenCV使用方法;

2、 掌握图像预处理技术编程实现。

实验内容:
1、Opencv安装及配置;Opencv基本操作。
具体包括:图像读取、存盘、显示;图像上图形操作;图像算术操作。

内容清单及所使用的函数:

  1. 图像IO操作的API:
    cv.imread(): 读取图像

cv.imshow():显示图像

cv.imwrite(): 保存图像

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 以灰度图的形式读取图像
img = cv.imread('./image/cat.jpeg',0)
# opencv中显示
cv.imshow('image',img)
cv.waitKey(0)
# 3 保存图像
cv.imwrite('./image/cat2.jpeg',img)
# matplotlib中展示
img = cv.imread('./image/cat2.jpeg')
plt.imshow(img[:,:,::-1])
plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
plt.show()
k = cv.waitKey(0)

在这里插入图片描述

  1. 在图像上绘制几何图像
    cv.line(): 绘制直线

cv.circle(): 绘制圆形

cv.rectangle(): 绘制矩形

cv.putText(): 在图像上添加文字

font

# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 创建一个空白的图像
img = np.zeros((512,512,3), np.uint8)
# 2 绘制图形
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.circle(img,(447,63), 63, (0,0,255), -1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
# 3 图像展示
plt.imshow(img[:,:,::-1])
plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

  1. 直接使用行列索引获取图像中的像素并进行修改
  2. 图像的属性
    img.shape

img.size

img.dtype

  1. 拆分通道:cv.split()
    通道合并:cv.merge()

  2. 色彩空间的改变

import numpy as np
import cv2 as cv
img = cv.imread('./image/cat.jpeg')
# 获取某个像素点的值
px = img[100,100]
print('像素值',px)
# 仅获取蓝色通道的强度值
blue = img[100,100,0]
# 修改某个位置的像素值
img[100,100] = [255,255,255]
print('修改后像素值',px,'蓝色强度值',blue)# 形状
xz = img.shape
# 大小
dx = img.size
# 类型
lx = img.dtype
print('形状',xz,'大小',dx,'类型',lx)# 通道拆分
b,g,r = cv.split(img)
print('拆分')
print(b,g,r)
# 通道合并
img2 = cv.merge((b,g,r))
print('合并')
print(img2)# 色彩空间的改变
img3 = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('image',img3)
cv.waitKey(0)
img4 = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('image',img4)
cv.waitKey(0)

在这里插入图片描述
在这里插入图片描述
7. 图像加法:将两幅图像加载一起
cv.add()

  1. 图像的混合:将两幅图像按照不同的比例进行混合
  2. 减、乘、除法
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
​
# 1 读取图像
#注意文件名,两个图像的格式、分辨率大小、长宽比需要相同
img1 = cv.imread('./image/1.jpg') 
img2 = cv.imread('./image/2.jpg')# 2 加法操作
img3 = cv.add(img1,img2) # cv中的加法
img4 = img1+img2 # 直接相加print(img3,img4)# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img3[:,:,::-1])
axes[0].set_title('cv中的加法')
axes[1].imshow(img4[:,:,::-1])
axes[1].set_title('直接相加')
plt.show()# 图像混合
img5 = cv.addWeighted(img1,0.7,img2,0.3,0)# 3 图像显示
plt.figure(figsize=(8,8))
plt.imshow(img5[:,:,::-1])
plt.show()
​
img6 = img1-img2 # 直接相减
img7 = img2-img1 # 反向相减# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img6[:,:,::-1])
axes[0].set_title('1-2')
axes[1].imshow(img7[:,:,::-1])
axes[1].set_title('2-1')
plt.show()
​
img8 = img1*img2 # 直接相乘
img9 = img2*img1 # 反向相乘# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img8[:,:,::-1])
axes[0].set_title('12')
axes[1].imshow(img9[:,:,::-1])
axes[1].set_title('21')
plt.show()
​
img10 = img1/img2 # 直接相除
img11 = img2/img1 # 反向相除# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img10[:,:,::-1])
axes[0].set_title('12')
axes[1].imshow(img11[:,:,::-1])
axes[1].set_title('21')
plt.show()

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

2、图像预处理:
(1)几何变换:图像缩放、图像平移、图像旋转、仿射变换、透射变换;

  1. 图像缩放:对图像进行放大或缩小
    cv.resize()

  2. 图像平移:
    指定平移矩阵后,调用cv.warpAffine()平移图像

  3. 图像旋转:
    调用cv.getRotationMatrix2D获取旋转矩阵,然后调用cv.warpAffine()进行旋转

  4. 仿射变换:
    调用cv.getAffineTransform将创建变换矩阵,最后该矩阵将传递给cv.warpAffine()进行变换

  5. 透射变换:
    通过函数cv.getPerspectiveTransform()找到变换矩阵,将cv.warpPerspective()进行投射变换

  6. 金字塔
    图像金字塔是图像多尺度表达的一种,使用的API:

cv.pyrUp(): 向上采样

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1. 读取图片
img1 = cv.imread("./image/dog.jpeg")
# 2.图像缩放
# 2.1 绝对尺寸
rows,cols = img1.shape[:2]
res = cv.resize(img1,(2*cols,2*rows),interpolation=cv.INTER_CUBIC)# 2.2 相对尺寸
res1 = cv.resize(img1,None,fx=0.5,fy=0.5)# 3 图像显示
# 3.1 使用opencv显示图像(不推荐)
#
# 3.2 使用matplotlib显示图像
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(res[:,:,::-1])
axes[0].set_title("绝对尺度(放大)")
axes[1].imshow(img1[:,:,::-1])
axes[1].set_title("原图")
axes[2].imshow(res1[:,:,::-1])
axes[2].set_title("相对尺度(缩小)")
plt.show()
​
img2 = cv.imread("./image/image2.jpg")# 2. 图像平移
rows,cols = img2.shape[:2]
M = M = np.float32([[1,0,100],[0,1,50]])# 平移矩阵
dst = cv.warpAffine(img2,M,(cols,rows))# 3. 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img2[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("平移后结果")
plt.show()
​
​
​
# 2 图像旋转
rows,cols = img2.shape[:2]
# 2.1 生成旋转矩阵
M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
# 2.2 进行旋转变换
dst = cv.warpAffine(img2,M,(cols,rows))# 3 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img2[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("旋转后结果")
plt.show()# 重载
​
img = cv.imread("./image/image2.jpg")# 2 仿射变换
rows,cols = img.shape[:2]
# 2.1 创建变换矩阵
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
# 2.2 完成仿射变换
dst = cv.warpAffine(img,M,(cols,rows))# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后结果")
plt.show()# 2 透射变换
rows,cols = img.shape[:2]
# 2.1 创建变换矩阵
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[100,145],[300,100],[80,290],[310,300]])
​
T = cv.getPerspectiveTransform(pts1,pts2)
# 2.2 进行变换
dst = cv.warpPerspective(img,T,(cols,rows))# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("透射后结果")
plt.show()
​
​
# 2 进行图像采样
up_img = cv.pyrUp(img)  # 上采样操作
img_1 = cv.pyrDown(img)  # 下采样操作
# 3 图像显示
cv.imshow('enlarge', up_img)
cv.imshow('original', img)
cv.imshow('shrink', img_1)
cv.waitKey(0)
cv.destroyAllWindows()

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

在这里插入图片描述

(2)空间域滤波:均值滤波、高斯滤波、中值滤波;

  1. 图像噪声
    椒盐噪声:图像中随机出现的白点或者黑点

高斯噪声:噪声的概率密度分布是正态分布

  1. 图像平滑
    均值滤波:算法简单,计算速度快,在去噪的同时去除了很多细节部分,将图像变得模糊

cv.blur()

高斯滤波: 去除高斯噪声

中值滤波: 去除椒盐噪声

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/sp.png')
# 2 均值滤波
blur = cv.blur(img,(5,5))
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('均值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()
​
​
# 1 图像读取
img2 = cv.imread('./image/ga.png')
# 2 高斯滤波
blur = cv.GaussianBlur(img2,(3,3),1)
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img2[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('高斯滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()# 2 中值滤波
blur = cv.medianBlur(img,5)
# 3 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('中值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()

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

(3)直方图修正:直方图均衡、直方图自适应均衡。

  1. 灰度直方图:
    cv.calcHist(images,channels,mask,histSize,ranges [,hist [,accumulate]])

  2. 掩膜
    创建蒙版,透过mask进行传递,可获取感兴趣区域的直方图

  3. 直方图均衡化:增强图像对比度的一种方法
    cv.equalizeHist(): 输入是灰度图像,输出是直方图均衡图像

  4. 自适应的直方图均衡
    将整幅图像分成很多小块,然后再对每一个小块分别进行直方图均衡化,最后进行拼接

clahe = cv.createCLAHE(clipLimit, tileGridSize)

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 1 直接以灰度图的方式读入
img = cv.imread('./image/cat.jpeg',0)
# 2 统计灰度图
histr = cv.calcHist([img],[0],None,[256],[0,256])
# 3 绘制灰度图
plt.figure(figsize=(10,6),dpi=100)
plt.plot(histr)
plt.grid()
plt.show()# 2. 创建蒙版
mask = np.zeros(img.shape[:2], np.uint8)
mask[400:650, 200:500] = 255
# 3.掩模
masked_img = cv.bitwise_and(img,img,mask = mask)
# 4. 统计掩膜后图像的灰度图
mask_histr = cv.calcHist([img],[0],mask,[256],[1,256])
# 5. 图像展示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img,cmap=plt.cm.gray)
axes[0,0].set_title("原图")
axes[0,1].imshow(mask,cmap=plt.cm.gray)
axes[0,1].set_title("蒙版数据")
axes[1,0].imshow(masked_img,cmap=plt.cm.gray)
axes[1,0].set_title("掩膜后数据")
axes[1,1].plot(mask_histr)
axes[1,1].grid()
axes[1,1].set_title("灰度直方图")
plt.show()# 2. 创建一个自适应均衡化的对象,并应用于图像
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
# 3. 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img,cmap=plt.cm.gray)
axes[0].set_title("原图")
axes[1].imshow(cl1,cmap=plt.cm.gray)
axes[1].set_title("自适应均衡化后的结果")
plt.show()# 2. 均衡化处理
dst = cv.equalizeHist(img)
# 3. 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img,cmap=plt.cm.gray)
axes[0].set_title("原图")
axes[1].imshow(dst,cmap=plt.cm.gray)
axes[1].set_title("均衡化后的结果")
plt.show()

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

实验收获:
了解到了关于图像处理的基本操作,并在OpenCV中执行,也学习到了在MATLAB中,图像RGB读取顺序的不同,并学会了通过OpenCV和MATLAB显示图像的方法。

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

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

相关文章

MCE | 分子伴侣介导的自噬

自噬是细胞在外界环境因素的影响下,利用溶酶体,降解自身受损、变性大分子物质或者细胞器的自我消化过程。依据其发生途径,主要分为三种:巨自噬 (Macroautophagy),微自噬 (Microautophagy) 和分子伴侣介导的自噬 (Chape…

MyBatis 缓存机制

文章目录一、一级缓存二、二级缓存1.cache 元素2.缓存命中率一、一级缓存 MyBatis 的一级缓存是 SqlSession 级别的缓存。如果同一个 SqlSession 对象多次执行完全相同的 SQL 语句,在第一次执行完成后,MyBatis 会将查询结果写入一级缓存中,此…

mysql中的binlog用法

binlog是什么 MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。使用mysqlb…

Kotlin语法学习(四)_空指针检查

空指针检查 空指针异常是一种不受编程语言检查的运行时异常,只能由程序员主动通过逻辑判断来避免,所以空指针异常往往比较容易出这个问题 可空类型系统 在Kotlin当中利用了编译时判空检查的机制几乎杜绝了空指针异常,Kotlin提供了一些列的工具,让我们能够轻松处理各种判空情…

Verilog 随机数及概率分布

随机数 Verilog 中使用系统任务 $random(seed) 产生随机数,seed 为随机数种子。seed 值不同,产生的随机数也不同。如果 seed 相同,产生的随机数也是一样的。可以为 seed 赋初值,也可以忽略 seed 选项,seed 默认初始值为…

130. 被围绕的区域

130. 被围绕的区域 给你一个 m∗nm * nm∗n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 实例1: 输入:board [[“X”,“X”,“X”,“X”],…

内容云筑底,火山引擎能否为企业添一把火?

在App里面再搭一个“今日头条”,让用户在自家的App里看图文、刷视频,这是很多企业都想干的一件事情。尤其是对于用户使用频率低的App而言,他们更需要依靠信息流内容加长用户停留时间,增加用户互动次数,进而留住用户&am…

神经网络和深度学习-梯度下降Gradient Descent

梯度下降 损失函数 绝大多数的机器学习模型都会有一个损失函数。比如常见的均方误差(Mean Squared Error)损失函数: L(w,b)1N∑i1N(yi−f(wxib))2L(w, b)\frac{1}{N} \sum_{i1}^{N}\left(y_{i}-f\left(w x_{i}b\right)\right)^{2} L(w,b)N1​i1∑N​(y…

物理层物理层

该层解决具体比特传输问题 一般的数据通信系统如图: 该系统可按通信方式分为两种:同步/异步通信和模拟/数字通信: 异步通信是通信双方各自时钟独立,每次只传输一个字符,时钟在传送开始时对齐;这种机制简单…

[附源码]计算机毕业设计JAVA驾校管理系统

[附源码]计算机毕业设计JAVA驾校管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis M…

Docker(四):Docker可视化管理工具

背景 在技术这一行,学无止境,无数的知识点在大脑里面堆积着。各种命令行脚本(Python,Java,Nodejs,Linux,Docker)数不胜数,如果有视图化的管理工具,帮我们管理着这些命令行脚本,岂不美哉。可以节…

11.22Spring 学习day02

1. 1.1 XML和注解的区别 xml优点: 把标签配置和java代码解耦一目了然,对于业务量大的需求,可以清晰表明各个对象的关系 缺点: 配置不方便,读取和解析需要一定的时间无法及时校验正确性 注解优点: 配置…

返乡人员信息登记管理系统,助力精准管控

随着全国疫情的零星化,再加上元旦与春节很快就要来临了。这几个月各省的人员流动性肯定会逐渐增加,为了应对佳节的人流高峰期,不少省市都早已发出通知。要求返乡人员提前3天提前报备行程,从而便于极大地提高了登记效率&#xff0c…

数字集成电路设计(五、仿真验证与 Testbench 编写)(四)

文章目录7. 用户自定义元件模型7.1 UDP应用实例8. 基本门级元件和模块的延时建模8.1 门级延迟建模8.1.1 门级延迟的基本延迟表达形式8.1.2 门级延迟的最小、典型、最大延迟表达形式8.1.3 例子用VerilogHDL建立图5.8-1 模块D的延迟仿真模块8.2 模块延迟建模8.2.1 延迟说明块 Spe…

数据分析和可视化必备的几大软件,你用过几个?

本文主要是面向数据分析初学者,因此分享的基本是一些免编程的可视化工具,详细介绍了7款工具,推荐大家使用,主要是让初学数据分析的朋友知道可视化工具大概有哪些、流行的有哪些。 Power BI Power BI是微软开发的商业分析工具。用户…

LeetCode 91 双周赛

2465. 不同的平均值数目 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组,你就重复执行以下步骤: 找到 nums 中的最小值,并删除它。找到 nums 中的最大值,并删除它。计算删除两数的平均值。 两数…

mysql InnooDb存储引擎的体系结构和逻辑存储结构

前言 这是一篇理论性比较强的文章,是不是很多人一听理论性的东西,就被劝退了?可千万别。其实分享内容非常简单,也非常干,相信你会喜欢的,对你也是有帮助的。切入正题,mysql的体系结构可以作为一…

机理类模型的建模思路|2021年亚太赛B题|2022备赛|前景目标提取

目录 一、 前景目标提取问题 1.背景目标和前景目标提取 2.问题一 2.2问题一求解 3.问题二 4.问题三 5.问题四 6.问题五​ 7.问题六 8.矩阵范数 二、前景目标提取——机理总结 三、编程实现 一、 前景目标提取问题 1.背景目标和前景目标提取 不动 & 动 视…

redis集群

Redis集群在保证主从加哨兵的基本功能之外,还能够提升Redis存储数据的能力。 一致性hash环 k1-->crc(16)? 0-16384 redis集群的ping-pang机制:一个主机向另一个主机ping,另一个pang回来,说明连接成功,通过这样的方…

脑与认知科学基础(期末复习)

脑与认知科学基础(期末复习) 文章目录脑与认知科学基础(期末复习)第一章 脑与认知科学简介认知元认知中国脑计划第二章 大脑简介Human brain解剖参考坐标大脑皮质脑的内侧和腹侧面神经系统神经系统的细胞神经元间信号传导神经回路…