opencv图像处理函数,opencv图像轮廓合并

opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换

本文主要介绍OpenCV图像处理中常用的几种几何变换:裁剪、放大、缩小、平移、错切、镜像、旋转、透视等。本文中的样例代码非常详细,有需要的朋友可以参考一下。

目录

0程序环境和学到的函数1剪切、放大和缩小2平移变换3错切变换4镜像变换5旋转变换6透视变换7最近邻插值和双线性插值。

0 程序环境与所学函数

本章运行程序需要导入以下三个库,并定义了一个显示图像的函数。

学习功能

# #放大和缩小

cv.resize(img,dsize,[插值])

# #翻译转换

M=np.array([[.]],dtype=np.float32)

瓦尔帕芬简历(img,M,dsize)

# #镜像转换

Cv.flip(img,1) #垂直镜面

Cv.flip(img,0) #水平镜像

Cv.flit(img,-1) #同时水平和垂直

# #旋转变换

M=cv.getRotationMatrix2D(中心,角度,刻度)

img_rotate=cv.rotate(img,cv。顺时针旋转90度)

# #透视变换

m=cv . getperspective transform(src,dst)

img=cv.warpPerspective(img,M,dsize)

1 裁剪、放大、缩小

读入图像

img=cv . im read( pic/rabbit 500 x333 . jpg )

显示(img)

显示

剪裁:数组选择方法(冒号)

#切

Rabbit=img[150:450:] #限制行数、列数和三个通道数

展示(兔子)

显示

放大和缩小:resize()函数

插值法

程序实现

#放大和缩小

#简历。resize (img,dsize,[interpolation]) dsize表示大小,[interpolation]是一种插值方法,可选,有默认值。

Img2=cv.resize(img,(500,400)) #放大到500宽400高。

#使用定义的插值方法

#一般来说;放大时选择线性法,缩小时选择面积法

img3=cv.resize(img,(500,400),插值=cv。最近的)

show(np.hstack([img2,img3])

显示

2 平移变换

原理和转换矩阵推导

读入图像

img=cv . im read( pic/rabbit 500 x333 . jpg )

显示(img)

显示

程序实现

# M=np.array([[.]],dtype=np.float32)

#简历。Waraffine (img,m,dsize)cv中的图像仿射变换函数,m为上矩阵,dsize为输出图像大小。

M=np.array([

[1,0,100],

[0,1,50]

],dtype=np.float32) #水平向右平移100像素,垂直向下平移50像素。原理见理论部分。

img2=cv.warpAffine(img,M,(333,500))

显示(img2)

显示

3 错切变换

交错矩阵的原理、推导

读入图像

img=cv . im read( pic/rabbit 500 x333 . jpg )

显示(img)

显示

水平交错切割

M=np.array([

[1,0.2,0],

[0,1,0]

],dtype=np.float32)

img3=cv.warpAffine(img,M,(533,500))

显示(img3)

显示

垂直交错切割

M=np.array([

[1,0,0],

[0.3,1,0]

],dtype=np.float32)

img3=cv.warpAffine(img,M,(333,700))

显示(img3)

显示

4 镜像变换

镜像矩阵的原理、推导

读入图像

img=cv . im read( pic/rabbit 500 x333 . jpg )

显示(img)

显示

水平镜像

Mx=np.array([

[-1,0,333],

[0,1,0]

],dtype=np.float32)

Img 2=cv.warpaffine (img,MX,(333,500)) #仿射变换函数

显示(img2)

显示

垂直镜像

My=np.array([

[1,0,0],

[0,-1,500]

],dtype=np.float32)

img3=cv.warpAffine(img,My,(333,500))

显示(img3)

显示

Opencv内置函数实现镜像转换

#垂直镜像cv.flip(img,1)

#水平镜像cv.flip(img,0)

# cv.flip(img,-1)同时水平和垂直

程序实现

Img4=cv.flip(img,1) #垂直镜像

Img5=cv.flip(img,0) #水平镜像

Img6=cv.flip(img,-1) #水平和垂直镜像同时完成。

show(np.hstack([img4,img5,img6])

显示

5 旋转变换

原理和旋转矩阵推导

读入图像

img=cv . im read( pic/rabbit 500 x333 . jpg )

显示(img)

显示

图像旋转

贝塔=np.pi/4

#旋转矩阵

M=np.array([

[np.cos(beta),np.sin(beta),0],

[-np.sin(beta),np.cos(beta),0]

],dtype=np.float32)

img2=cv.warpAffine(img,M,(633,300))

显示(img2)

显示

Opencv内置了旋转矩阵函数:

M=cv.getRotationMatrix2D(中心,角度,刻度)

Center是旋转的中心,angle是旋转的角度,scale表示是放大还是缩小。

使用上述函数获取旋转矩阵,实现图像旋转。

h,w,c=img.shape #获取图像的高度和宽度,方便后期设置旋转中心。

M2=cv . getrotationmatrix 2d((w//2,h//2),45,1)

Img3=cv.warpaffine (img,m2,(533,500)) #仿射函数实现

显示(img3

显示

Opencv内置图像旋转功能

img_rotate=cv.rotate(img,cv。逆时针旋转90度)

只能以90度的倍数旋转。

程序实现

#逆时针旋转90度

img_rotate=cv.rotate(img,cv。逆时针旋转90度)

显示(img_rotate)

显示

6 透视变换

m=cv . getperspective transform(str,dst)

Str:原始图像矩阵的结束位置,dst:目标图像矩阵的位置。

img2=cv.warpPerspective(img,M,(w,h))

读入图像

img=cv . im read( pic/Parthenon 500 x750 . jpg )

显示(img)

显示

程序实现

#定位原图中的四个点。这里我们找到了柱子前面四个点的大概位置。我们通过肉眼观察发现了它们。

str=np.array([

[210,50],

[610,270],

[650,470],

[150,450]

],dtype=np.float32)

#目标图像中的矩阵

dst=np.array([

[150,50],

[650,50],

[650,470],

[150,470]

],dtype=np.float32)

h,w,c=img.shape

#透视变换将类似矩形的图形拉成矩形。

m=cv . getperspective transform(str,dst)

img2=cv.warpPerspective(img,M,(w,h))

显示(img2)

显示

应用:车道检测,图像校正

7 最近邻插值、双线性插值

原则:

最近邻插值图:

双线性插值图

读入图像

img=cv . im read( pic/rabbit 50x 33 . jpg )

显示(img)

显示

程序实现

1=cv.resize (img,(330,500),interpolation=cv . inter _ nearest)#最近邻插值

Img=cv。resize (img,(330,500),插值=cv。精确两条线的新插值

show(np.hstack([img1,img2])

显示

可以看出,最近邻插值是模糊的,过渡结果不如双线性插值平滑。

以下是OpenCV图像的七种常见几何变换的细节。关于OpenCV图像几何变换的更多信息,请关注我们的其他相关文章!

opencv图像处理函数,opencv图像轮廓合并