一、opencv中的绘图函数
1、线段绘制
函数:cv2.line(img,pts,color,thickness,linetype)
参数说明:img:待绘制图像; pts:起点和终点;color:线条颜色,是元组形式的数据,如(255,0,0);thickness:线条的粗细,-1为填充,默认值是1;linetype:线条的类型
import numpy as np
import cv2
#创建一个黑色背景图
img=np.zeros((512,512,3),np.uint8)
#绘制线段
cv2.line(img,(0,0),(200,500),(255,0,0),1)
winname='example'
cv2.namedWindow(winname)
cv2.imshow(winname,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、矩形绘制
函数:cv2.rectangle(img,pts,color,thickness,linetype)
其中, pts为左上角和右下角的坐标,其余参数同上
import numpy as np
import cv2
#创建一个黑色背景图
img=np.zeros((512,512,3),np.uint8)
#参数2:左上角坐标,参数3:右下角坐标
cv2.rectangle(img,(200,200),(400,400),(255,0,0),-1)
winname='example'
cv2.namedWindow(winname)
cv2.imshow(winname,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、圆的绘制
函数:cv2.circle(img,pts,radius,color,thickness,linetype)
其中, pts为圆心的坐标;radius为半径,其余参数同上
import numpy as np
import cv2
#创建一个黑色背景图
img=np.zeros((512,512,3),np.uint8)
#参数2:圆心坐标,参数3:半径
cv2.circle(img,(200,200),42,(255,0,0),1)
winname='example'
cv2.namedWindow(winname)
cv2.imshow(winname,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、椭圆的绘制
函数:cv2.ellipse()
参数1:待绘制的图像;参数2:椭圆中心(x,y);参数3:x/y轴(长短半轴)的长度;参数4:angle即椭圆的旋转角度;参数5:startAngle即椭圆的起始角度;参数6:endAngle椭圆的结束角度
import numpy as np
import cv2
#创建一个黑色背景图
img=np.zeros((512,512,3),np.uint8)
cv2.ellipse(img,(200,200),(100,50),0,30,360,(255,0,0),1)
winname='example'
cv2.namedWindow(winname)
cv2.imshow(winname,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、多边形绘制
函数:cv2.polylines(img,pts,isClosed,color,thickness,lineType)
其中,pts以点对形式出现,表示多边形中各个顶点的坐标;isClosed为布尔型变量,True表示线段闭合,False表示仅保留线段;其余参数同上
import numpy as np
import cv2
#创建一个黑色背景图
img=np.zeros((512,512,3),np.uint8)
pts=np.array([[10,5],[50,10],[70,20],[20,30]])
#若输入的数字不是成对出现,则将他们转化成1*2的矩阵形式
pts=pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(255,0,0),1)
winname='example'
cv2.namedWindow(winname)
cv2.imshow(winname,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6、添加文字
函数:cv2.putText()
参数1:要添加文字的图片;参数2:要添加的文本;参数3:文字的起始坐标(左下角为起点);参数4:字体;参数5:文字大小;参数6:颜色;参数7:线条宽度;参数8:线条形状
import numpy as np
import cv2
#创建一个黑色背景图
img=np.zeros((512,512,3),np.uint8)
font=cv2.FONT_HERSHEY_SIMPLEX
#参数2:左上角坐标,参数3:右下角坐标
cv2.putText(img,'Hello',(10,500),font,4,(255,255,255),2,cv2.LINE_AA)
winname='example'
cv2.namedWindow(winname)
cv2.imshow(winname,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、图像的几何变换
1、图像平移
将图像中所有的点按照指定的平移量水平或者垂直移动,由仿射变换函数实现
仿射变换函数:cv2.warpAffine(src,M,dsize,flags,borderMode,borderValue)
其中:
src-输入图像
M-变换矩阵
dsize -输出图像的大小。
flags-插值方法的组合
borderMode-边界像素模式
borderValue-边界填充值;默认情况下为0。
上述参数中,M作为仿射变换矩阵,一般反映平移或旋转的关系,为lnputArray类型的2×3的变换矩阵。
flages表示插值方式(插值:为未知的点预测它的灰度值),默认为flags=cV2.INTER_LINEAR,表示线性插值,
此外还有:
cv2.lNTER_NEAREST(最近邻插值)cv2.INTERAREA一(区域插值)
cv2.INTER cUBIC(三次样条插值)
cv2.INTERLANCZOS4 (Lanczos插值)
import cv2
import numpy as np
img=cv2.imread('plt.png')
#构造移动矩阵H,表示在x轴方向移动50,在y轴方向移动25
H=np.float32([[1,0,50],[0,1,25]])
rows,cols=img.shape[:2]
print(img.shape)
print(rows,cols)
#注意这里rows和cols需要反置,也就是先列后行
res=cv2.warpAffine(img,H,(cols,rows))
cv2.imshow("origin_picture",img)
cv2.imshow("new_picture",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、图像缩放
图像缩放是指图像的大小按照指定的比例进行放大或缩小,上采样和下采样也就是对图像进行了缩放。
下(降)采样:缩小图像
上采样:放大图像,得到更高分辨率的图像
函数:cv2.resize(src,dsize,fx,fy,interpolation)
scr:原图
dsize:输出图像尺寸,与比例因子二选一
fx:沿水平轴的比例因子
fy:沿垂直轴的比例因子
interpolation:插值
插值法:
默认为flags=Cv2.INTER_ NEAREST (最近邻插值)
CV2.INTER_ LINEAR, 线性插值
CV2.INTER_ CUBIC三次样条插值4x4像素邻域
CV2.INTER_ LANCZOS4 Lanczos插值, 8x8像素邻域
CV2.INTER_ AREA区域插值
import cv2
import numpy as np
img=cv2.imread('plt.png')
#通过设置缩放比例来对图像进行放大或缩小
res1=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)
#直接设置图像的大小不需要缩放因子
res2=cv2.resize(img,(int(0.8*width),int(0.8*height)),interpolation=cv2.INTER_AREA)
cv2.imshow("origin_picture",img)
cv2.imshow("res1",res1)
cv2.imshow("res2",res2)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、图像旋转
以图像的中心(或任一像素点)为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。 旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换和仿射变换来实现
变换矩阵函数:cv2.getRotationMatrix2D(center,angle,scale)
center:图片的旋转中心
angle:旋转角度
scale:缩放比例,0.5表示缩小一半,当值为正时表示逆时针,负值表示顺时针
import cv2
import numpy as np
img=cv2.imread('plt.png')
row,col=img.shape[:2]
#旋转中心为图像的中点
M=cv2.getRotationMatrix2D((col/2,row/2),45,-1)
res=cv2.warpAffine(img,M,(col,row))
cv2.imshow("img",img)
cv2.imshow("res",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、仿射变换
作用:通过仿射变换对图片进行旋转、平移、缩放等操作达到数据增强的效果
仿射变换矩阵函数:M=cv2.getAffineTransform(pos1,pos2)
pos1表示变换前的位置,pos2表示变换后的位置
import cv2
import numpy as np
img=cv2.imread('plt.png')
row,col=img.shape[:2]
#设置图像仿射变换的矩阵
pos1=np.float32([[50,50],[200,50],[50,200]])
pos2=np.float32([[10,100],[200,50],[100,250]])
M=cv2.getAffineTransform(pos1,pos2)
print(M)
res=cv2.warpAffine(img,M,(col,row))
cv2.imshow("img",img)
cv2.imshow("res",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、透视变化
本质是将图像投影到一个新的视平面
矩阵变换函数:M=cv2.getPerspectiveTransfoem(pos1,pos2)
pos1表示透视变化前四个点对应位置,pos2表示透视变化后四个点对应位置
cv2.warpPerspective(src,M,(col,row))
src表示原始图像
M表示透视变换矩阵
(col,row)表示变换后的图像大小
import cv2
import numpy as np
img=cv2.imread('plt.png')
row,col=img.shape[:2]
#设置图像透视变换的矩阵
pos1=np.float32([[114,82],[287,155],[8,100],[143,177]])
pos2=np.float32([[0,0],[188,0],[0,262],[188,262]])
M=cv2.getPerspectiveTransform(pos1,pos2)
res=cv2.warpPerspective(img,M,(col,row))
cv2.imshow("img",img)
cv2.imshow("res",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、图像滤波与增强
图像滤波基础知识:
1.滤波实际上是信号处理得一个概念,图像可以看成一个二维信号,其中像素点的灰度值代表信号的强弱;
2.高频: 图像上变化剧烈的部分;
3.低频:图像灰度值变化缓慢,平坦的地方;
4.根据图像高低频, 设置高通和低通滤波器。高通滤波器可以检测变化尖锐,明显
的地方,低通可以让图像变得平滑,消除噪声;
5.滤波作用: 高通滤波器用于边缘检测,低通滤波器用于图像平滑去噪;
6.滤波可以分为线性滤波(包括方框滤波/均值滤波/高斯滤波)和非线性滤波:(中值滤波/双边滤波);
7、邻域算子:利用给定像素周围的像素值决定此像素的最终输出值的一种算子;线性滤波实际是一种常用的领域算子,像素输出取决与输入像素的加权和,形式上类似于卷积操作
1、方框滤波(box Filter)
作用:可以用来模糊一张图片
方框滤波核:
当normalize=true时,表示对滤波核进行归一化,此时与均值滤波相同
当normalize=false时,对原始的像素值直接加权求和,像素值很容易超过255发生溢出
函数:cv2.boxFliter(src,depth,ksize,normalize)
depth表示目标图像的深度(depth=-1表示与输入保持一致);ksize表示滤波核大小
import cv2
import numpy as np
img=cv2.imread('plt.png',cv2.IMREAD_UNCHANGED)
row,col=img.shape[:2]
r=cv2.boxFilter(img,-1,(3,3),normalize=1)
d=cv2.boxFilter(img,-1,(5,5),normalize=0)
cv2.imshow("img",img)
cv2.imshow("r",r)
cv2.imshow("d",d)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、均值滤波
取滤波核区域内元素的均值
函数:cv2.blur(src,ksize)
#均值滤波
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("cv.png")
cv2.imshow("img",img)
#将BGR转换为RGB,下面使用plt显示图片的方式为RGB
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
blur=cv2.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("blur")
plt.xticks([]),plt.yticks([])
plt.show()
3、高斯滤波
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声广泛应用于图像处理的减噪过程。高斯滤波的卷积核权重并不相同,中间像素点权重最高,越远离中心的像素权重越小。其原理是一个2维高斯函数)
函数:cv2.GuassianBlur(src,ksize,std)
std表示标准差,调整标准差也就是在调整周围像素值对当前像素值的影响程度,调大标准差也就是提高了远处像素点对中心像素的影像程度,滤波结果也就越平滑
#高斯滤波
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("cv.png")
#cv2.imshow("img",img)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
blur=cv2.GaussianBlur(img,(5,5),0)
plt.subplot(121),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("blur")
plt.xticks([]),plt.yticks([])
plt.show()
4、中值滤波
用像素点邻域灰度值的中值来代替该点的灰度值,中值滤波可以去除椒盐噪声和斑点噪声
函数:cv2.medianBlur(img,ksize)
#中值滤波
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("cv.png")
#cv2.imshow("img",img)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
blur=cv2.medianBlur(img,9)
plt.subplot(121),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("blur")
plt.xticks([]),plt.yticks([])
plt.show()
5、双边滤波
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空间信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。
函数:cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace)
其中:d为像素的邻域直径;sigmaColor为灰度值相似性高斯函数标准差;sigmaSpace为空间高斯函数标准差
#双边滤波
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("cv.png")
#cv2.imshow("img",img)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
blur=cv2.bilateralFilter(img,-1,15,10)
plt.subplot(121),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("blur")
plt.xticks([]),plt.yticks([])
plt.show()