opencv图像处理—图像基本处理

一、opencv中绘图函数
1、线段绘制
函数:cv2.line(img,pts, color,thickness,linetype)
参数说明:img:待绘制图像。
• color:形状的颜色,元组如(255,0,0)。
• pts:起点和终点
• thickness:线条的粗细。 -1为填充,默认值是 1.
• linetype:线条的类型,8型或cv2.LINE_AA,默认值为8型。

img=np.zeros((512,512,3),np.uint8)
#绘制一条线宽为5的线段
cv2.line(img,(0,0),(511,511),(255,0,0),5)
cv2.imshow("1",img)
cv2.waitKey()

2、矩形绘制
函数:cv2.rectangle(img,prets, color,thickness, linetype)
参数说明:img:待绘制图像;
• pts:左上角和右下角坐标点;
• color:形状的颜色,元组如(255,0,0);
• thickness:线条的粗细。 -1为填充,默认值是 1;
• linetype:线条的类型,使用默认值即可;

cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

3、圆、椭圆绘制
函数:cv2.circle(img,pts, radius,color,thickness, linetype)
参数说明:img:待绘制图像。
• pts:圆心。
• radius:半径。
• color:颜色。
• thickness:线条的粗细。 -1为填充,默认值是 1。
• linetype:线条的类型,使用默认值即可。

#圆的绘制
cv2.circle(img,(100,63),63,(0,0,255),-1)

函数:cv2.ellipse()
参数说明:
参数2:椭圆中心(x,y)
参数3:x/y轴的长度
参数4:angle–椭圆的旋转角度
参数5:startAngle–椭圆的起始角度
参数6:endAngle–椭圆的结束角度

#椭圆的绘制
cv2.ellipse(img,(256,256),(100,50),0,0,180,(255,0,0),-1)

函数
cv2.polylines(img,pts,isClosed,color,thickness,lineType)
参数说明:
参数1:img图像,表示你要在哪张图像上画线
参数2:pts,表示的是点对,形式如下:
参数3:isClosed,布尔型,True表示的是线段闭合,False表示的是仅保留线段(最后一根线不闭合)
参数4:color,线段颜色,格式是(R,G,B)值
参数5:thickness, 数值型,线宽度,默认值为1,-1则会填充整个图形;
参数6:lineType,线型;

#多边形的绘制
#定义4个顶点的坐标
pts=np.array([[10,5],[50,10],[70,20],[20,30]])
#4个顶点 把他转成4个1行2列的矩阵
pts=pts.reshape((-1,1,2))
print(pts)
#绘制多边形
cv2.polylines(img,[pts],True,(0,255,255))

4、添加文字
函数:cv2.putText()
同样请对照后面的代码理解这几个参数:
参数2:要添加的文本
参数3:文字的起始坐标(左下角为起点)
参数4:字体
参数5:文字大小(缩放比例)
参数6:颜色
参数7:线条宽度
参数8:线条形状

#添加文字
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'opencv',(10,50),font,4,(255,255,255),2,cv2.LINE_AA)

二、图像的几何变换(图像扩增)
1、平移
图像平移:将图像中所有的点按照指定的平移量水平或者垂直移动。
变换公式:设(x0,y0)为原图像上的一点,图像水平平移量为Tx,垂直平移量为Ty,则平移后的点坐标(x1,y1)变为 :
x1=x0+Tx; y1=y0+Ty
仿射变换函数:cv2.warpAffine(src, M, dsize flags,borderMode,borderValue)
其中:
src - 输入图像。
M - 变换矩阵。
dsize - 输出图像的大小。
flags - 插值方法的组合(int 类型!)
borderMode - 边界像素模式(int 类型!)
borderValue - (重点!)边界填充值; 默认情况下为0。
上述参数中: M作为仿射变换矩阵,一般反映平移或旋转的关系,InputArray类型的2×3的变换矩阵。
flages表示插值方式,默认为
flags=cv2.INTER_LINEAR,表示线性插值,
此外还有:
cv2.INTER_NEAREST(最近邻插值)
cv2.INTER_AREA (区域插值)
cv2.INTER_CUBIC(三次样条插值)
cv2.INTER_LANCZOS4(Lanczos插值)

img=cv2.imread("road.jpg")
#构造一个变换矩阵
#在x轴方向移动多少距离,在y轴方向移动多少距离
H=np.float32([[1,0,50],[0,1,25]])
rows,cols=img.shape[:2]
print(img.shape)
print(rows,cols)
#平移 ,这里先平移列,后行
res=cv2.warpAffine(img,H,(cols,rows))
cv2.imshow("src",img)
cv2.imshow("new",res)
cv2.waitKey()

2、缩放
图像缩放:图像缩放是指图像大小按照指定的比例进行放大或者缩小。
函数:
cv2.resize(src,dsize=None,fx,fy,interpolation)
scr:原图
dsize:输出图像尺寸,与比例因子二选一
fx:沿水平轴的比例因子
fy:沿垂直轴的比例因子
interpolation:插值方法

res1=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
height,width=img.shape[:2]
res2=cv2.resize(img,(int(0.5*width),int(0.5*height)),interpolation=cv2.INTER_LANCZOS4)
cv2.imshow("src",img)
cv2.imshow("new1",res1)
cv2.imshow("new2",res2)
cv2.waitKey()

3、旋转(抵抗旋转不变性)
图像的旋转
以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。设点 逆时针旋转 角后的对应点为那么,旋转后点 的坐标是:
在这里插入图片描述
变换矩阵函数:
cv2.getRotationMatrix2D(center, angle, scale)
参数:
center:图片的旋转中心
angle:旋转角度
scale:缩放比例,0.5表示缩小一半正为逆时针,负值为顺时针

#图像旋转
#变换矩阵
m=cv2.getRotationMatrix2D((cols/2,rows/2),45,-1)
dst=cv2.warpAffine(img,m,(cols,rows))
cv2.imshow("src",img)
cv2.imshow("dst",dst)

利用上述方法进行图像旋转时需要注意如下两点:
(1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。
(2)图像旋转之后,会出现许多空洞点。对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理

4、仿射变换
仿射变换的作用:通过仿射变换对图片进行旋转、平移、缩放等操作以达到数据增强的效果。线性变换从几何直观上来看有两个要点:
1、变换前是直线,变换后依然是直线
2、直线的比例保持不变
仿射变换:平移、旋转、放缩、剪切、反射
函数:
仿射变换的函数原型如下:
M = cv2.getAffineTransform(pos1,pos2)
pos1表示变换前的位置
pos2表示变换后的位置

#仿射变换
pos1=np.float32([[50,50],[200,50],[50,200]])
pos2=np.float32([[10,100],[200,50],[100,250]])
m1=cv2.getAffineTransform(pos1,pos2)
result=cv2.warpAffine(img,m1,(cols,rows))
cv2.imshow("src",img)
cv2.imshow("dst",result)

6、透视变换
透视变换:本质是将图像投影到一个新的视平面。
函数:
M = cv2.getPerspectiveTransform(pos1, pos2)
pos1表示透视变换前的4个点对应位置
pos2表示透视变换后的4个点对应位置
cv2.warpPerspective(src,M,(cols,rows))
src表示原始图像
M表示透视变换矩阵
(rows,cols)表示变换后的图像大小,rows表示行数,cols表示列数

#透视变换
pt1=np.float32([[114,82],[287,156],[8,100],[143,177]])
pt2=np.float32([[0,0],[188,0],[0,262],[188,262]])
m2=cv2.getPerspectiveTransform(pt1,pt2)
res3=cv2.warpPerspective(img,m2,(cols,rows))
cv2.imshow("src",img)
cv2.imshow("dst",res3)

你可能感兴趣的:(opencv,python,深度学习)