分享

python...

 大傻子的文渊阁 2022-11-21 发布于浙江

安装

  1. c++安装
    参考:opencv3.2 和opencv2.4同时安装

  2. python安装

pip install opencv-contrib-python==3.4.3.18

1:cv.read()、cv.imwrite()

作用:读取/写入图片(注意:读取的通道为BGR)
参考:写入图片的三种形式 PIL /CV2 /Scipy
OpenCV使用:

#读取图片
img_path = "img.jpg"
img = cv.imread(img_path)	#BGR  opencv特点
#写入图片
cv.imwrite("img.png", img) 

注,在读取操作时,PIL的Image.open函数读取的通道为RGB,速度比cv.read快。

2. cv2.findContours、cv2.drawContours函数

作用:图像的轮廓检测、图像的轮廓绘制
参数详解
使用:

import cv2  
  
img = cv2.imread('test.jpg')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  	#转灰度图
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
  
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  #找出轮廓点
cv2.drawContours(img,contours,-1,(0,0,255),3)  #绘制轮廓
  
cv2.imshow("img", img)  
cv2.waitKey(0)  

注,opencv2和opencv3的版本不同,findContours的输出会有不同,稍微注意一下

3. cv2.copyMakeBorder函数

作用:扩展图像边界
参考:Python 边界增加copyMakeBorder

4.cv2.createThinPlateSplineShapeTransformer()

作用:将图片按给定要求标准化
参考: 薄板样条插值(Thin plate splines)

5.cv2.copyTo()

作用:对图片进行抠图操作(根据mask去原图截)
参考:copyTo(python版)

6.cv2.circle / cv2.putText()

作用: cv2.circle 在指定位置做圆 ;
cv2.putText() 在指定位置输出文字
使用:

#cv2.circle
#2个参数为圆心位置, 3个参数为半径,4个参数为颜色
cv2.circle(img, (int(coords[0]),int(coords[1])), 3, (0,0,255), -1)

#cv2.putText()
#2个参数为要写的文字, 3个参数为位置,4个参数为字体,
for i in range(len(edge_points)):
	cv2.putText(img, str(i), (int(edge_points[i][0]),int(edge_points[i][1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2)

7.cv2.Laplacian()

作用:计算图片的模糊程度
参考:图像的模糊检测方法

8.cv2.resize()

作用:改变图片大小
参考:图片放缩

9.cv2.add/addWeighted()

作用:将两张图片融合(size要求一致)
参考:OpenCV-Python图片叠加与融合,cv2.add与cv2.addWeighted的区别
注:图片上下左右连接参考:Python 图片连接(不重叠):

10.cv2.seamlessClone()

作用:图片无缝融合(不要求size一致)
参考:opencv实现无缝融合–seamless clone

11.cv2.GaussianBlur()、cv2.filter2D()

作用:模糊图片细节(高斯模糊)、动态模糊
参考:https://blog.csdn.net/dcrmg/article/details/82317181

12.旋转图片 cv2.getRotationMatrix2D()、cv2.warpAffine()

作用:用于旋转图片固定角度
参考:图片旋转
注:cv2的旋转是不保边的,保边旋转可以使用imutils.rotate_bound(参考)

13.镜像翻转flip()

基本认知
图像的几何变换是指在不改变图像像素值的前提下对图像像素进行空间几何变换。

常见的几何变换有:

  • 镜像
  • 平移
  • 旋转
  • 缩放
  • 仿射
    本节介绍图像镜像翻转变换,作为知识储备。

代码实现

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
import sys
import copy

#python 图像翻转,自定义翻转

img = cv.imread('ABC.png')

if img.all()==None:
    print('No Such image!')
    sys.exit(0)
size = img.shape
iCopy = copy.deepcopy(img)  # 深度拷贝 即:重建了一份图像数据
iCopy1 = copy.deepcopy(img)
iCopy2 = copy.deepcopy(img)
h = size[0]  	# 图像高
w = size[1]  	# 宽
c = size[3]		# 通道  彩色图像为3  灰度为1

# 自定义镜像 通过像素逐个拷贝的方式
for i in range(h):
    for j in range(w):
        iCopy[i,w-1-j] = img[i,j]#水平镜像
        iCopy1[h-1-i,j] = img[i,j]#垂直镜像
        iCopy2[h-1-i,w-1-j] = img[i,j]#对角镜像
# 注意: 自定义镜像耗时: 2.5306708812713623        
plt.subplot(221),plt.imshow(img)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(iCopy)
plt.title('Remap shuiping Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(iCopy1)
plt.title('Remap chuizhi Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(iCopy2)
plt.title('Remap duijiao Image'), plt.xticks([]), plt.yticks([])
plt.show()


#python 图像翻转,使用openCV flip()方法翻转
xImg = cv.flip(img,1,dst=None) #水平镜像  参数1:原始图像;参数2:镜像种类;参数3:dst输出图像
xImg1 = cv.flip(img,0,dst=None) #垂直镜像    =1 水平  =2 垂直  =-1 对焦
xImg2 = cv.flip(img,-1,dst=None) #对角镜像
# opencv flip函数耗时: 0.00498199462890625
plt.subplot(221),plt.imshow(img)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(xImg)
plt.title('Remap shuiping Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(xImg1)
plt.title('Remap chuizhi Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(xImg2)
plt.title('Remap duijiao Image'), plt.xticks([]), plt.yticks([])

plt.show()

知识点
两个方式:

1. 通过操作图像像素来镜像翻转。       耗时长,自定义镜像耗时: 2.5306708812713623  
2. 调用openCV flip()方法进行镜像翻转,结果都是一样滴。   耗时短,# opencv flip函数耗时: 0.00498199462890625

耗时长短一目了然,因此,建议使用openCV flip() 方法

13.放射变换、透视变换、tps插值

参考:Thin Plate Spline (薄板样条函数)(TPS)
参考:刚性变换、仿射变换、透视变换和非线形变换
参考:图像处理的仿射变换与透视变换

放射变换(线性变换)是2维空间,给定3个点,可以映射;只能是刚性变换,比如平移,翻转,裁剪;
透视变换(线性变换)是3维空间,给定4个点,可以映射;
tps插值的话是非刚性形变,相对自然,可以输入多个点,去插值;比如给定原始形状的有限点集A,变形后的对应目标点集B,设C=B-A,对(Ax,Ay, Cx)拟合出一个TPS,就可以得到x方向的内插函数;对(Ax,Ay, Cy)拟合出来的TPS则可以得到y方向的内插函数。这样一以来对于不在点集中的点,我们就可以插值得到目标点。从而完成整个面的变形。

14.cv2.minAreaRect、cv2.boxPoints

作用:获取点集的最小外接矩形、获取最小外接矩定点坐标
参考:minAreaRect 、boxPoints

15.meanStdDev

作用:获取图片部分区域的均值和均方差
参考:meanStdDev使用
注:可以计算不规则区域的均值与方差,mean, var = cv2.meanStdDev(img, mask = mask)

16.contourArea、arcLength、approxPolyDP

作用:计算轮廓面积、周长、获得轮廓近似
参考:approxPolyDP

17.cv2.inpaint()

作用:图像修复,用于去水印、logo等
参考:图片去水印或文字及打马赛克

18.cv2.VideoCapture()

作用:获得视频的一些基本信息
参考:VideoCapture.get()参数详解

————————————————
版权声明:本文为CSDN博主「一只帅气的小菜鸡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42028608/article/details/105896489

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多