Python计算机视觉函数

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()




原始图像,与量化不同份的效果图如下:

                                          Python计算机视觉函数_第1张图片

图片采样

图片采样是把图片以一定的间隔进行像素采样,具体代码如下

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()

 运行结果如下:

                                               Python计算机视觉函数_第2张图片

 采样时,图像的真实大小会同样发生变化,其大小随着采样点的增加正比例减小

图像金字塔

图像金字塔是图像按照分辨率从低到高构成的金字塔,最低的分辨率位于塔尖,原图位于塔底,高斯金字塔可以下采样,也可以实现上采样

高斯金字塔上下采样 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:目标图像

Python计算机视觉函数_第3张图片

图像腐蚀 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,计算机视觉,图像处理)