OpenCV-Python计算机视觉函数
Posted 一只会飞的猪️
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-Python计算机视觉函数相关的知识,希望对你有一定的参考价值。
目录
添加噪声 skimage.util.random_noise
1、概述
这篇文章主要记录我所了解到的一些OpenCV的函数和参数介绍,主要是参考博主一马归一码的Python计算机视觉学习做了一些常用的图像处理的函数和具体的参数介绍,方便大家查找,也方便自己回顾复习,同时沉淀自身,加强理解。全文基于Python-OpenCV,import cv2 as cv。
2、OpenCV基础
读取图片 imread
cv.imread()
括号里面写图片的路径,同在一个文件夹,可以写相对路径也可以绝对路径;不同文件夹,需要写绝对路径
调整显示窗口大小 resizeWindow
cv.resizeWindow('windowsname',width,height)
windowsname:窗口名称
width:宽度
height:高度
调整图像尺寸大小 resize
cv.resize(InputArray src, OutputArray dst, Size dsize, fx, fy, int interpolation=INTER_LINEAR )
InputArray src:输入的图片
OutputArray dst:输出的图片
dsize:是对图片大小进行设置,可以直接(x,y)设置大小,也可以设置为None,通过fx,fy调整
fx:x方向上的缩放比例
fy:y方向上的缩放比例
interpolation:插值方式,一般不设置,直接使用默认值,不对其进行操作
色彩空间进行转换 cvtColor
cv.cvtColor(src,cv.COLOR_BGR2GRAY)
src:输入的图片
cv.COLOR_BGR2GRAY:这个具体的有很多种,具体格式是cv.COLOR_固定不变,然后是哪个色彩空间到哪个色彩控机,比如BGR到灰度空间,就是BGR2GRAY
绘制线段 line
cv.line(img, pt1, pt2, color, thickness, lineType, shift)
img:输入图片
plt1:绘制直线的起始点坐标
plt2:绘制直线的终点坐标
color:线的颜色
thickness:线的粗细
linetype:线的形状
shift:有资料显示是坐标点小数点的位数,具体可以不设置,一般用默认值,不设置
绘制矩形框 rectangle
cv.rectangle(img, pt1, pt2, color, thickness, lineType, shifte)
img:输入图片
plt1:矩形左上角的坐标
plt2:矩形右下角的坐标
color:线条颜色
thickness:线条宽度
linteype:线条形状
shift:有资料显示是坐标点小数点的位数,具体可以不设置,一般用默认值,不设置
绘制圆形 circle
cv.circle(img, center, radius, color, thickness, lineType, shift)
img:输入图片
center:圆心坐标
radius:半径
color:线条颜色
thickness:线条宽度
linteype:线条形状
shift:有资料显示是坐标点小数点的位数,具体可以不设置,一般用默认值,不设置
绘制椭圆 ellipse
cv.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)
img:输入图片
center:圆心坐标
angle:长轴&短轴
startAngle:起始角度
endAngle:终止角度
color:椭圆颜色
thickness:线宽
lineType:线条形状
shift:一般用默认值,不设置
添加文本 putText
cv.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
img:输入图片
text:绘制的文字
org:绘制的位置
fontFace:字体
fontScale:缩放
color:文本颜色
thickness:文本的大小
linetype:线型
bottomleftOrigin:一般不做操作,使用默认值
显示图片 imshow
cv.imshow(winname, mat)
winname:显示图片窗口的名字
mat:需要显示的图片
保存图片 imwrite
cv.imwrite(filename, img, params=None)
filename:需要保存图像的文件名,后缀为格式
img:要保存的图片
params:表示为特定格式保存的参数编码,一般不对其进行操作,使用默认值
图片显示时长 waitKey
cv.waitKey()
一般里面的参数值设置为,代表一直循环把图片显示在桌面上。如果不设置这个,图片只会一瞬间显示,就消失了。括号里面也可以设置显示时长。
释放内存 destroyAllWindows
cv.destroyAllWindows()
紧跟着cv.waitKey()出现,在关闭窗口后对内存进行释放
3、数字图像处理基本操作
读取像素值 shape
print(img.shape)
img.shape:读取图片的像素值,通过print打印出来
PIL库的使用(与OpenCV比较)
主要是使用PIL里面的Image对图像进行操作,导入Image: from PIL import Image
使用Image.open()读取图片,参数为图片的路径
使用Image读取图片时,看图片像素值使用print(img.size)
会发现结果与OpenCV读取的相反,主要是因为cv.imread()读取的是BGR格式,而Image.open()读取的是RGB格式,所以两者的Red&Blue刚好相反。
Image使用img.save()保存图片,括号里的参数为保存的路径和保存的名称和图片格式,save的前缀是需要保存的图片名字,与OpenCV的cv.imwrite用法相似
4、OpenCV进行图像算数与逻辑运算
图像相加 addWeighted
cv.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype)
使用该函数的时候,图像分辨率必须一致,通道数一致
src1:图像1
alpha:图像1的权值
src2:图像2
beta:图像2的权值
gamma:为合成图像像素所加的数,也算是像素的偏移量
dst:输出的数组,和输入的两个数组拥有相同的尺寸和通道数
dtype:可选,输出阵列的深度,有默认值-1。当两个输入数组具有相同深度时,这个参数设置为-1
图像像素加常数 add
cv.add(src1, src2, dst, mask, dtype)
src1:输入的图像1
src2:输入的常数矩阵,和图像1相等大小的,固定常数的矩阵
dst:相加后的输出图像,一般不对其进行操作
mask:8位单通道图像,用于指定哪些像素需要相加,一般不对其进行操作
dtype
:输出图像的深度(像素值位数),一般不对其进行操作
图像的减法运算 subtract
cv.subtract(src1, src2, dst, mask, dtype)
src1:输入图像1
src:输入的常数矩阵,和图像1相等大小的,固定常数的矩阵
dst:相减后的输出图像,一般不对其进行操作
mask:8位单通道图像,用于指定哪些像素需要相减,一般不对其进行操作
dtype
:输出图像的深度(像素值位数),一般不对其进行操作
图像的与运算 bitwise_and
cv.bitwise_and(src1, src2, dst=None, mask=None)
src1:输入图像1
src2:输入图像2
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
图像的或计算 bitwise_or
cv.bitwise_or(src1, src2, dst, mask)
src1:输入图像1
src2:输入图像2
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
图像的异或运算 bitwise_xor
cv.bitwise_xor(src1, src2, dst, mask)
src1:输入图像1
src2:输入图像2
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
图像非运算 bitwise_not
cv.bitwise_not(src, dst, mask)
src:输入图像
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
5、OpenCV进行图像几何变换
平移图像 warpAffine
cv.warpAffine(img,mat,size)
img:移动的图像
mat:平移矩阵,决定平移的方向和距离 mat = np.float([[1,0,0],[0,1,20]]) 平移矩阵 对y进行平移20个单位
size:平移后显示的图像大小
旋转变换 getRotationMatrix2D
cv.getRotationMatrix2D(center, angle, scale)
center:旋转中心
angle:旋转角度
scale:缩放比例
图片复制 copy.deepcopy
copy.deepcopy(img)
需要先导入copy模块 img:需要复制的图片
水平镜像
通过for循环对左右像素点进行交换
垂直镜像
通过for循环对上下像素点进行交换
对角镜像
水平镜像和垂直镜像同时发生,即对角对称
6、透视变换
透视矩阵 getPerspectiveTransform
cv.getPerspectiveTransform(src, dst, solveMethod)
src:原图上四个点的坐标构成的矩阵,要求其中任意三点不共线
dst:目标图像上四个点的坐标构成的矩阵,要求其中任意三点不共线,且每个点与src的对应点对应
solveMethod:矩阵分解方法
example:pts1 = np.float32([[0, 0], [500, 0], [0, 740], [500, 740]])
pts2 = np.float32([[0, 100], [510, 0], [100, 760], [500, 740]])
M = cv.getPerspectiveTransform(pts1,pts2)
透视变换 warpPerspective
cv. warpPerspective(src, M, dsize, dst, flags, borderMode, borderValue)
src:输入图像矩阵
M:3*3的透视变换矩阵,可以通过getPerspectiveTransform等函数获取
dsize:结果图像大小,为宽和高的二元组
dst:输出结果图像,可以省略,结果图像会作为函数处理结果输出
flags:可选参数,插值方法的组合(int 类型)
borderMode:可选参数,边界像素模式(int 类型)
borderValue:可选参数,边界填充值
7、OpenCV进行图像量化与采样
图像量化
量化即对图像进去取模,然后以一些像素值代替所有像素值,其原理与二值法相似,没有具体的函数,具体的代码参考下方
import matplotlib.pyplot as plt
import cv2 as cv
import numpy as np
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\\Windows\\Fonts\\MSYHL.TTC")
'读取图片信息'
img = cv.imread('lovely.jpg')
img1 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('lovely', img)
cv.waitKey(0)
cv.destroyAllWindows()
print(img1)
'对原始图像矩阵的值进行操作'
img2 = np.uint8(img1/4)
print(img2)
img3 = np.uint8(img1/16)*16
img4 = np.uint8(img/32)*32
img5 = np.uint8(img/64)*64
img6 = np.uint8(img >= 128)*128
# 显示得到的图像
title = ['原始图像', '量化为64份', '量化为16份', '量化为8份', '量化为4份', '量化为2份'] # 子图标题
img = [img1, img2, img3, img4, img5, img6]
for i in range(6):
plt.subplot(2, 3, i + 1) # python 列表从0开始计数,所以此处 i+1
plt.imshow(img[i], 'gray')
plt.title(title[i], fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.show()
原始图像,与量化不同份的效果图如下:
图片采样
图片采样是把图片以一定的间隔进行像素采样,具体代码如下
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\\Windows\\Fonts\\MSYHL.TTC")
# 读取图片
img = cv.imread('lovely.jpg')
img1 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img2 = cv.cvtColor(img, cv.COLOR_BGR2RGB) # plt显示的是RGB图,而OpenCV产生的是BGR图
cv.imshow('lovely', img)
cv.waitKey(0)
cv.destroyAllWindows()
img8 = img1[0:-1:2, 0:-1:2] # 间隔为2采样
img9 = img1[0:-1:4, 0:-1:4]
img10 = img1[0:-1:8, 0:-1:8]
img11 = img1[0:-1:16, 0:-1:16]
titles = ['原始图像', '256*256', '128*128', '64*64', '32*32', '16*16']
image = [img2, img1, img8, img9, img10, img11]
for j in range(6):
plt.subplot(2, 3, j + 1)
if j == 0:
plt.imshow(image[j])
else:
plt.imshow(image[j], 'gray')
plt.title(titles[j], fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.show()
运行结果如下:
采样时,图像的真实大小会同样发生变化,其大小随着采样点的增加正比例减小
图像金字塔
图像金字塔是图像按照分辨率从低到高构成的金字塔,最低的分辨率位于塔尖,原图位于塔底,高斯金字塔可以下采样,也可以实现上采样
高斯金字塔上下采样 pyrDown pyrUp
cv.pyrDown(src)
src:输入要下采样的图片
cv.pyrUp(src)
src:输入要上采样的图片
上采样下采样不可逆,因为丢失的图像序列信息是未知的,需要通过拉普拉斯金字塔来还原原图
拉普拉斯金字塔 L = G-pyrUp(G+1)
获取高斯金字塔变换丢失的图像信息 L = G-pyrUp(G+1)
通过拉普拉斯金子塔获取丢失信息,还原原图
局部马赛克
马赛克的原理就是一片区域的像素点以区域里的一个点代替,产生相同像素点,在人眼形成’马赛克视觉‘
8、Opencv进行直方图统计
绘制直方图函数 calcHist
cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)
images:输入的图片
channels:指定通道 [0]代表灰度图,如果读入的图像不是灰度图,该值可以是[0],[1],[2]分别代表
通道 B,G,R
mask:掩码图像,进行整张图的绘制时为 None
histSize:分成像素组的数量
ranges:像素值范围
accumulate:累计标识,一般可以省略,不对其进行操作
写法除了None不需要[ ],其余都需要 [ ],example cv.calcHist([img], [0], None, [256], [0, 255])
9、OpenCV进行直方图均衡化实现图像增强
全局直方图均衡化 equalizeHist
cv.equalizeHist(src)
src:需要直方图均衡化的图片
局部直方图均衡化 createCLAHE
cv.createCLAHE(clipLimit, tileGridSize)
clipLimit:一般设置为2.0
tileGridSize:对图像进行小区域分割
example cv.createCLAHE(clipLimit=2.0, tileGridSize=(10, 10))
10、OpenCV进行图像平滑
添加噪声 skimage.util.random_noise
skimage.util.random_noise(image, mode=‘gaussian’, seed=None, clip=True, **kwargs)
image: 添加噪声的图像
mode: 添加的噪声类型:
‘gaussian’ 高斯加性噪声
‘localvar’ 高斯加性噪声,每点具有特定的局部方差
‘poisson’ 泊松分布的噪声
'salt’盐噪声,随机用1替换像素。属于高灰度噪声
‘pepper’ 胡椒噪声,随机用0或-1替换像素,属于低灰度噪声
‘s&p’椒盐噪声,两种噪声同时出现,呈现出黑白杂点)
后面的参数在运用时一般不对其操作,直接使用默认值
均值滤波 blur
cv.blur(src,ksize)
src:需要处理的图像
ksize:选取的核大小
example cv.blur(img,(6,5))
方框滤波 boxFilter
cv.boxFilter(src,ddepth,ksize,normalize)
src:输入图片
ddepth:目标图像的深度
ksize:核大小
normalize:是否归一化,使用布尔值进行选择
example cv.boxFilter(img, ddepth = -1, ksize(2,2),normalize = False)
高斯滤波 GaussianBlur
cv.GaussianBlur(src,kszie,sigmax)
src:输入图片
ksize:滤波器大小
sigmax:标准差,一般设置为0
example cv.GaussianBlur(img,(5,5),0)
中值滤波 medianBlur
cv.medianBlur(src,ksize)
src:输入图片
ksize:滤波器尺寸大小,必须为奇数
example cv.medianBlur(img,9)
11、OpenCV图像锐化及边缘检测
Sobel算子 Sobel
cv.Sobel(src,ddepth,dx,dy,ksize)
src :输入图像
ddepth:输出图像深度,输入8U有正负一起可能值很大,最好是CV_16S/CV_32F
dx:X方向,几阶导数
dy: Y方向,几阶导数.
ksize:Sobel算子ksize大小,必须是1、3、5、7
example: cv.Sobel(img,cv.CV_64F,0,1,ksize=5)
Laplacian算子 Laplacian
cv.Laplacian(src,ddepth,ksize)
src:输入图像
ddepth:输出图像深度
ksize:核大小
example: cv.Laplacian(img,cv.CV_64F)
Scharr算子 Scharr
cv.Scharr(src,ddepth,dx,dy,ksize)
src :输入图像
ddepth:输出图像深度,输入8U有正负一起可能值很大,最好是CV_16S/CV_32F
dx:X方向,几阶导数
dy: Y方向,几阶导数.
ksize:核大小
example: cv.Scharr(img,cv.CV_64F,0,1)
Canny算子 Canny
cv.Canny(src,threshold1,threshold2)
src:输入图片
threshold1:阈值1
threshold2:阈值2
example cv.Canny(img,100,200)
12、OpenCV图像形态学处理
图像二值化 threshold
cv.threshold(src,thresh,maxval,type,dst)
src:输入图像
thresh:阈值
maxval:当type指定为THRESH_BINARY或THRESH_BINARY_INV时,需要设置该值
type:指定阈值类型
dst:目标图像
图像腐蚀 erode
cv.erode(src,kernel,iterations)
src:输入图像
kernel:核的大小
iterations:迭代次数,默认为1
example cv.erode(img,kernel=(3,3),,iterations=1)
图像膨胀 dilate
cv.dilate(src,kernel,iterations)
src:输入图像
kernel:核的大小
iterations:迭代次数,默认为1
example cv.dilate(img,kernel=(3,3),,iterations=1)
图像开、闭、梯度、顶帽、底帽运算 morphologyEx
cv.morphologyEx(src,op,kernel)
src:输入图像
op:操作的类型
kernel:核的大小
开运算把类型设为cv.MORPH_OPEN
闭运算把类型设为cv.MORPH_CLOSE
梯度运算把类型设为cv.MORPH_GRADIENT
顶帽运算把类型设为cv.MORPH_TOPHAT
底帽运算把类型设为cv.MORPH_BLACKHAT
总结与感悟
这篇文章主要是来帮自己记住一些函数或者函数的参数操作方法,具体的理论还有全代码学习可以参考(61条消息) 一马归一码的博客_CSDN博客-Python,DSP,Python计算机视觉领域博主这位博主大大的Python计算机视觉,我想肯定会有帮助。里面有些函数只写了主要的参数,一些默认的参数没有全都写完,在实际中使用需要自己依照需求考量。现在先写到这里,随着我的所学,会对内容进行不断地更新以及改进,对参数对函数,对设计的算法领域都会有不断地更新。希望通过博客的方式对所学进行总结,同时对自我进行沉淀,也作为以后回顾的资料。
以上是关于OpenCV-Python计算机视觉函数的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV-Python实战(20)——OpenCV计算机视觉项目在Web端的部署
OpenCV-Python实战(23)——将OpenCV计算机视觉项目部署到云端