脚本宝典收集整理的这篇文章主要介绍了OpenCV-Python计算机视觉函数,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
目录
1、概述
2、OpenCV基础
读取图片 imread
调整显示窗口大小 resizeWindow
调整图像尺寸大小 resize
色彩空间进行转换 cvtColor
绘制线段 line
绘制矩形框 rectangle
绘制圆形 circle
绘制椭圆 ellipse
添加文本 putText
显示图片 imshow
保存图片 imwrite
图片显示时长 waitKey
释放内存 destroyAllWindows
3、数字图像处理基本操作
读取像素值 shape
PIL库的使用(与OpenCV比较)
4、OpenCV进行图像算数与逻辑运算
图像相加 addWeighted
图像像素加常数 add
图像的减法运算 subtract
图像的与运算 bitwise_and
图像的或计算 bitwise_or
图像的异或运算 bitwise_xor
图像非运算 bitwise_not
5、OpenCV进行图像几何变换
平移图像 warpAffine
旋转变换 getRotationMatrix2D
图片复制 copy.deepcopy
水平镜像
垂直镜像
对角镜像
6、透视变换
透视矩阵 getPerspectiveTransform
透视变换 warpPerspective
7、OpenCV进行图像量化与采样
图像量化
图片采样
图像金字塔
高斯金字塔上下采样 pyrDown pyrUp
拉普拉斯金字塔 L = G-pyrUp(G+1)
局部马赛克
8、Opencv进行直方图统计
绘制直方图函数 calcHist
9、OpenCV进行直方图均衡化实现图像增强
全局直方图均衡化 equalizeHist
局部直方图均衡化 createCLAHE
10、OpenCV进行图像平滑
添加噪声 skimage.util.random_noise
均值滤波 blur
方框滤波 boxFilter
高斯滤波 GaussianBlur
中值滤波 medianBlur
11、OpenCV图像锐化及边缘检测
Sobel算子 Sobel
Laplacian算子 Laplacian
Scharr算子 Scharr
Canny算子 Canny
12、OpenCV图像形态学处理
图像二值化 threshold
图像腐蚀 erode
图像膨胀 dilate
图像开、闭、梯度、顶帽、底帽运算 morphologyEx
总结与感悟
这篇文章主要记录我所了解到的一些OpenCV的函数和参数介绍,主要是参考博主一马归一码的Python计算机视觉学习做了一些常用的图像处理的函数和具体的参数介绍,方便大家查找,也方便自己回顾复习,同时沉淀自身,加强理解。全文基于Python-OpenCV,import cv2 as cv。
cv.imread()
括号里面写图片的路径,同在一个文件夹,可以写相对路径也可以绝对路径;不同文件夹,需要写绝对路径
cv.resizeWindow('windowsname',width,height)
windowsname:窗口名称
width:宽度
height:高度
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:插值方式,一般不设置,直接使用默认值,不对其进行操作
cv.cvtColor(src,cv.COLOR_BGR2GRAY)
src:输入的图片
cv.COLOR_BGR2GRAY:这个具体的有很多种,具体格式是cv.COLOR_固定不变,然后是哪个色彩空间到哪个色彩控机,比如BGR到灰度空间,就是BGR2GRAY
cv.line(img, pt1, pt2, color, thickness, lineType, shift)
img:输入图片
plt1:绘制直线的起始点坐标
plt2:绘制直线的终点坐标
color:线的颜色
thickness:线的粗细
linetype:线的形状
shift:有资料显示是坐标点小数点的位数,具体可以不设置,一般用默认值,不设置
cv.rectangle(img, pt1, pt2, color, thickness, lineType, shifte)
img:输入图片
plt1:矩形左上角的坐标
plt2:矩形右下角的坐标
color:线条颜色
thickness:线条宽度
linteype:线条形状
shift:有资料显示是坐标点小数点的位数,具体可以不设置,一般用默认值,不设置
cv.circle(img, center, radius, color, thickness, lineType, shift)
img:输入图片
center:圆心坐标
radius:半径
color:线条颜色
thickness:线条宽度
linteype:线条形状
shift:有资料显示是坐标点小数点的位数,具体可以不设置,一般用默认值,不设置
cv.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)
img:输入图片
center:圆心坐标
angle:长轴&短轴
startAngle:起始角度
endAngle:终止角度
color:椭圆颜色
thickness:线宽
lineType:线条形状
shift:一般用默认值,不设置
cv.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
img:输入图片
text:绘制的文字
org:绘制的位置
fontFace:字体
fontScale:缩放
color:文本颜色
thickness:文本的大小
linetype:线型
bottomleftOrigin:一般不做操作,使用默认值
cv.imshow(winname, mat)
winname:显示图片窗口的名字
mat:需要显示的图片
cv.imwrite(filename, img, params=None)
filename:需要保存图像的文件名,后缀为格式
img:要保存的图片
params:表示为特定格式保存的参数编码,一般不对其进行操作,使用默认值
cv.waitKey()
一般里面的参数值设置为,代表一直循环把图片显示在桌面上。如果不设置这个,图片只会一瞬间显示,就消失了。括号里面也可以设置显示时长。
cv.destroyAllWindows()
紧跟着cv.waitKey()出现,在关闭窗口后对内存进行释放
print(img.shape)
img.shape:读取图片的像素值,通过print打印出来
主要是使用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用法相似
cv.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype)
使用该函数的时候,图像分辨率必须一致,通道数一致
src1:图像1
alpha:图像1的权值
src2:图像2
beta:图像2的权值
gamma:为合成图像像素所加的数,也算是像素的偏移量
dst:输出的数组,和输入的两个数组拥有相同的尺寸和通道数
dtype:可选,输出阵列的深度,有默认值-1。当两个输入数组具有相同深度时,这个参数设置为-1
cv.add(src1, src2, dst, mask, dtype)
src1:输入的图像1
src2:输入的常数矩阵,和图像1相等大小的,固定常数的矩阵
dst:相加后的输出图像,一般不对其进行操作
mask:8位单通道图像,用于指定哪些像素需要相加,一般不对其进行操作
dtype
:输出图像的深度(像素值位数),一般不对其进行操作
cv.subtract(src1, src2, dst, mask, dtype)
src1:输入图像1
src:输入的常数矩阵,和图像1相等大小的,固定常数的矩阵
dst:相减后的输出图像,一般不对其进行操作
mask:8位单通道图像,用于指定哪些像素需要相减,一般不对其进行操作
dtype
:输出图像的深度(像素值位数),一般不对其进行操作
cv.bitwise_and(src1, src2, dst=None, mask=None)
src1:输入图像1
src2:输入图像2
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
cv.bitwise_or(src1, src2, dst, mask)
src1:输入图像1
src2:输入图像2
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
cv.bitwise_xor(src1, src2, dst, mask)
src1:输入图像1
src2:输入图像2
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
cv.bitwise_not(src, dst, mask)
src:输入图像
dst:可选输出变量,一般不对其进行操作
mask:掩膜图像,可选参数,一般不对其进行操作
cv.warpAffine(img,mat,size)
img:移动的图像
mat:平移矩阵,决定平移的方向和距离 mat = np.float([[1,0,0],[0,1,20]]) 平移矩阵 对y进行平移20个单位
size:平移后显示的图像大小
cv.getRotationMatrix2D(center, angle, scale)
center:旋转中心
angle:旋转角度
scale:缩放比例
copy.deepcopy(img)
需要先导入copy模块 img:需要复制的图片
通过for循环对左右像素点进行交换
通过for循环对上下像素点进行交换
水平镜像和垂直镜像同时发生,即对角对称
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)
cv. warpPerspective(src, M, dsize, dst, flags, borderMode, borderValue)
src:输入图像矩阵
M:3*3的透视变换矩阵,可以通过getPerspectiveTransform等函数获取
dsize:结果图像大小,为宽和高的二元组
dst:输出结果图像,可以省略,结果图像会作为函数处理结果输出
flags:可选参数,插值方法的组合(int 类型)
borderMode:可选参数,边界像素模式(int 类型)
borderValue:可选参数,边界填充值
量化即对图像进去取模,然后以一些像素值代替所有像素值,其原理与二值法相似,没有具体的函数,具体的代码参考下方
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:WindowsFontsMSYHL.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:WindowsFontsMSYHL.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()
运行结果如下:
采样时,图像的真实大小会同样发生变化,其大小随着采样点的增加正比例减小
图像金字塔是图像按照分辨率从低到高构成的金字塔,最低的分辨率位于塔尖,原图位于塔底,高斯金字塔可以下采样,也可以实现上采样
cv.pyrDown(src)
src:输入要下采样的图片
cv.pyrUp(src)
src:输入要上采样的图片
上采样下采样不可逆,因为丢失的图像序列信息是未知的,需要通过拉普拉斯金字塔来还原原图
获取高斯金字塔变换丢失的图像信息 L = G-pyrUp(G+1)
通过拉普拉斯金子塔获取丢失信息,还原原图
马赛克的原理就是一片区域的像素点以区域里的一个点代替,产生相同像素点,在人眼形成’马赛克视觉‘
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])
cv.equalizeHist(src)
src:需要直方图均衡化的图片
cv.createCLAHE(clipLimit, tileGridSize)
clipLimit:一般设置为2.0
tileGridSize:对图像进行小区域分割
example cv.createCLAHE(clipLimit=2.0, tileGridSize=(10, 10))
skimage.util.random_noise(image, mode=‘gaussian’, seed=None, clip=True, **kwargs)
image: 添加噪声的图像
mode: 添加的噪声类型:
‘gaussian’ 高斯加性噪声
‘localvar’ 高斯加性噪声,每点具有特定的局部方差
‘poisson’ 泊松分布的噪声
'salt’盐噪声,随机用1替换像素。属于高灰度噪声
‘pepper’ 胡椒噪声,随机用0或-1替换像素,属于低灰度噪声
‘s&p’椒盐噪声,两种噪声同时出现,呈现出黑白杂点)
后面的参数在运用时一般不对其操作,直接使用默认值
cv.blur(src,ksize)
src:需要处理的图像
ksize:选取的核大小
example cv.blur(img,(6,5))
cv.boxFilter(src,ddepth,ksize,normalize)
src:输入图片
ddepth:目标图像的深度
ksize:核大小
normalize:是否归一化,使用布尔值进行选择
example cv.boxFilter(img, ddepth = -1, ksize(2,2),normalize = False)
cv.GaussianBlur(src,kszie,sigmax)
src:输入图片
ksize:滤波器大小
sigmax:标准差,一般设置为0
example cv.GaussianBlur(img,(5,5),0)
cv.medianBlur(src,ksize)
src:输入图片
ksize:滤波器尺寸大小,必须为奇数
example cv.medianBlur(img,9)
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)
cv.Laplacian(src,ddepth,ksize)
src:输入图像
ddepth:输出图像深度
ksize:核大小
example: cv.Laplacian(img,cv.CV_64F)
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)
cv.Canny(src,threshold1,threshold2)
src:输入图片
threshold1:阈值1
threshold2:阈值2
example cv.Canny(img,100,200)
cv.threshold(src,thresh,maxval,type,dst)
src:输入图像
thresh:阈值
maxval:当type指定为THRESH_BINARY或THRESH_BINARY_INV时,需要设置该值
type:指定阈值类型
dst:目标图像
cv.erode(src,kernel,iterations)
src:输入图像
kernel:核的大小
iterations:迭代次数,默认为1
example cv.erode(img,kernel=(3,3),,iterations=1)
cv.dilate(src,kernel,iterations)
src:输入图像
kernel:核的大小
iterations:迭代次数,默认为1
example cv.dilate(img,kernel=(3,3),,iterations=1)
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计算机视觉函数所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。