摘要:如果不设置这个,图片只会一瞬间显示,就消失了。括号里面也可以设置显示时长。
目录
添加噪声 skimage.util.random_noise
这篇文章主要记录我所了解到的一些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 pltimport cv2 as cvimport numpy as npfrom matplotlib import font_managermy_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)*16img4 = np.uint8(img/32)*32img5 = np.uint8(img/64)*64img6 = 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 cvimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib import font_managermy_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()
运行结果如下:
采样时,图像的真实大小会同样发生变化,其大小随着采样点的增加正比例减小
图像金字塔是图像按照分辨率从低到高构成的金字塔,最低的分辨率位于塔尖,原图位于塔底,高斯金字塔可以下采样,也可以实现上采样
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计算机视觉,我想肯定会有帮助。里面有些函数只写了主要的参数,一些默认的参数没有全都写完,在实际中使用需要自己依照需求考量。现在先写到这里,随着我的所学,会对内容进行不断地更新以及改进,对参数对函数,对设计的算法领域都会有不断地更新。希望通过博客的方式对所学进行总结,同时对自我进行沉淀,也作为以后回顾的资料。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123481.html
摘要:而这其中,很多应用都涉及到计算机视觉这样一个细分领域。常见的图像处理灰度图二值化平滑边缘提取这几种都属于数字图像处理的常用方法。对这方面知识感兴趣的,可以找本数字图像处理的相关教材系统地看一遍,了解数字图像处理的基础。 人工智能 ,一个已经被谈论了几十年的概念(最早是 图灵 在 1950年 提出)。如今这几年,相关技术的发展速度是越来越快。高大上如无人驾驶、智能安防、AI辅助诊断,接地...
摘要:但无论是用于何种用途,这些图像都需要进行处理。图像处理中的常见任务包括显示图像,基本操作如裁剪翻转旋转等,图像分割,分类和特征提取,图像恢复和图像识别。图像处理系统有时被称为图像处理的瑞士军刀。 showImg(https://segmentfault.com/img/remote/1460000019631626); 原文标题:10 Python image manipulation...
OpenCV-Python实战(4)——OpenCV常见图像处理技术(❤️万字长文,含大量示例❤️) 0. 前言1. 拆分与合并通道2. 图像的几何变换2.1 缩放图像2.2 平移图像2.3 旋转图像2.4 图像的仿射变换2.5 图像的透视变换2.6 裁剪图像 3. 图像滤波3.1 应用滤波器(卷积核或简称为核)3.2 图像平滑3.2.1 均值滤波3.2.2 高斯滤波3.2.3 中值滤波3.2...
摘要:之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。该库包含基本的图像处理功能,包括点操作使用一组内置卷积内核进行过滤以及颜色空间转换。图像处理系统有时被称为图像处理的瑞士军刀。 showImg(https://segmentfault.com/img/remote/1460000019442221);编译:张秋玥、小七、蒋宝尚 本...
摘要:它是图像处理图像模式识别和计算机视觉技术的基本步骤之一。轮廓检测可能是一种用于形状分析和对象检测和识别的有用技术。对整个图像进行边缘检测,而仅对图像内的对象进行轮廓检测。 计算机视觉的重点是从计算机中的视频和图像中提取有意义的信息。在本文中,我们将从初学者开始探索一个使用 OpenCV ...
阅读 1927·2021-11-16 11:44
阅读 1565·2021-11-11 16:55
阅读 2323·2021-08-27 13:11
阅读 3487·2019-08-30 15:53
阅读 2184·2019-08-30 15:44
阅读 1138·2019-08-30 11:20
阅读 910·2019-08-30 10:55
阅读 819·2019-08-29 18:40