OpenCV-Python计算机视觉函数

Posted 一只会飞的猪️

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

总结与感悟


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计算机视觉项目部署到云端

opencv-python 极速入门

OpenCV-Python实战(16)——人脸追踪详解

OpenCV-Python实战——直方图均衡化(含大量示例,建议收藏)

OpenCV-Python实战(15)——面部特征点检测详解(仅需5行代码学会3种面部特征点检测方法)