python教程分享Python OpenCV的基本使用及相关函数

python-opencv环境的配置看上一篇opencv环境的配置
本篇主要介绍一下opencv的基本使用和相关函数的介绍。
以下所有操作都基于这三个库:
import cv2
import numpy as np
import matplotlib.pylab as plt

原图

Python OpenCV的基本使用及相关函数

1、图像的读取

import cv2  img = cv2.imread('文件路径'[,cv2.imread_unchanged])  # 其他参数  # 以原图读取 -cv2.imread_unchanged-默认  # 以灰度图读取 -cv2.imread_grayscale  # 以彩色图读取 -cv2.imread_color  

2、图像保存

import cv2  cv2.imwrite('image/gray_test.jpg',img)  

3、图像展示

(1)使用opencv自带的显示函数

import cv2  # 可以决定窗口是否可以调整大小。  # cv2.namedwindow('image', cv2.window_normal) # 特殊情况  cv2.imshow('显示窗口的名字',img)  cv2.waitkey(0)  cv2.destroyallwindows() # 关闭所有窗口  '''  cv2.waitkey(num)函数的参数介绍  num<0 按键输入消失  num==0 或不填系数 ,一直不消失  num>0 停滞num秒  '''  

(2)使用matplotlib库实现
不能直接用matplotlib去显示opencv读取的图像,因为opencv读取的图像的通道顺序是[b,g,r],而matplotlib显示图像时图像的通道顺序是[r,g,b]。
解决办法

import cv2    img = cv2.imread('文件路径')  # 第一种方法  img = cv2.cvtcolor(img, cv2.color_bgr2rgb)  # 第二种方法  # b, g, r = cv2.split(img)  # img = cv2.merge([r, g, b])  

显示图像

import cv2  matplotlib.pyplot as plt  img = cv2.imread('文件路径')  img = cv2.cvtcolor(img, cv2.color_bgr2rgb)  plt.rcparams['font.sans-serif'] = ['fangsong']  # 支持中文标签  # (2,2,1)表示一共可显示2行2列4个图像,1表示第一个图像  plt.subplot(2,2,1), plt.title("图1") #  plt.axis('off') 关闭坐标轴  plt.imshow(img) # 还可以添加一个参数cmap='gray'  plt.subplot(2,2,2), plt.title("图2")  plt.imshow(img)  plt.subplot(2,2,3), plt.title("图3"),   plt.imshow(img)  plt.subplot(2,2,4), plt.title("图4"),   plt.imshow(img)    plt.show()

(3)拼接图像并显示

import cv2  import numpy as np    # 拼接多个图片并显示  img1 = cv2.imread("1.jpg",cv2.imread_unchanged)  img2 = cv2.imread("2.jpg",cv2.imread_unchanged)  # 需要将两图片的大小改为一致  # heigh = img1.shape[0] # 高  # width = img1.shape[1] # 宽  img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]))  res = np.hstack((img1,img2,img2)) # 水平连接  # np.vstack((img1,img2,img2)) # 竖直连接  cv2.imshow('res',res)  cv2.waitkey(0)  cv2.destroyallwindows()  

4、获取图像属性

# 获取bgr图的高、宽  heigh = img.shape[0] # 高  width = img.shape[1] # 宽  # 获取bgr图的高、宽、深度  h,w,d = img.shape  # 获得图片大小 h*w 或 h*w*d  img_size = img.size  # 获得图片数据类型  img.dtype  

5、图像缩放(宽,高)

# 图片缩放->(200,100)  img2 = cv2.resize(img1, (200, 100)) # (宽,高)  # 按比例缩放->(0.5,1.2)  img2 = cv2.resize(img1, (round(cols * 0.5), round(rows * 1.2)))  # 按比例缩放,参数版  img2 = cv2.resize(img1, none, fx=1.2, fy=0)  

6、在原图像中获取某一区域

# 获取区域在原图中的四个点的位置(x1,y1)(x2,y1)(x1,y2)(x2,y2)  # 图像高度不变,切割宽度,原图上开始横坐标-->原图上结束横坐标  # img_x_y = img[高:高,宽:宽]  img_x_y_1 = img[ : , x1(开始横坐标):x2(结束横坐标)]  # 图像宽度不变,切割高度,原图上开始纵坐标-->原图上结束纵坐标  img_x_y_2 = img[y1(开始纵坐标):y2(结束纵坐标), : ]  # 获取具体位置  img_x_y = img[y1(开始纵坐标):y2(结束纵坐标),x1(开始横坐标):x2(结束横坐标)]  

例如:

import cv2  path = 'c:\users\lenovo\desktop\demo.jpg'  img = cv2.imread(path)  img_1 = img[100:600,200:500]  cv2.imshow('1',img_1)  cv2.waitkey(0)  cv2.destroyallwindows()  

Python OpenCV的基本使用及相关函数

7、彩色图像通道分解

# 通道分解方案1  b = img[:,:,0]  g = img[:,:,1]  r = img[:,:,2]  # 通道分解方案2  b,g,r = cv2.split(img)  # 通道合并  rgb = cv2.merge([r,g,b])  # 只显示蓝色通道  b = cv2.split(a)[0]  g = np.zeros((rows,cols),dtype=a.dtype)  r = np.zeros((rows,cols),dtype=a.dtype)  m = cv2.merge([b,g,r])  

8、图像加法

# 超过255则为0  result1 = img1 + img2  # 超过255则为255  result2 = cv2.add(img1, img2)  # 图像带权重融合,第5个参数为偏移量  result = cv2.addweighted(img1,0.5,img2,0.5, 0)  

9、图像反转

img2 = cv2.flip(img1, 0) #上下翻转  img2 = cv2.flip(img1, 1) #左右翻转  img2 = cv2.flip(img1, -1) #上下、左右翻转  

10、图像金字塔

# 图片向下采样,高斯滤波 1/2 删掉偶数列  img1 = cv2.pyrdown(img)  # 图片向上采样 ,面积*2 高斯滤波*4 ,下采样为不可逆运算  img3 = cv2.pyrup(img2)  # 计算拉普拉斯金字塔  img1 = cv2.pyrdown(img) #下采样  img2 = cv2.pyrup(img1) #上采样  img3 = img-img2  

11、直方图

##matplotlib 绘制直方图  plt.hist(img.ravel(),256)  ##用opencv计算直方图列表  hist = cv2.calchist(images= [img],channels=[0],mask=none,histsize=[256],ranges=[0,255])  ##掩膜提取局部直方图  pad = np.zeros(img.shape,np.uint8)  pad[200:400,200:400]=255  hist_mask = cv2.calchist(images= [img],channels=[0],mask=pad,histsize=[256],ranges=[0,255])  ##opencv 交、并、补、异或操作  masked_img = cv2.bitwise_and(img,mask)  ##直方图均衡化原理  # 图像直方图->直方图归一化->累计直方图->*255 # x坐标映射->对原来的像素值进行新像素值编码  # 直方图均衡化调用  img1 = cv2.equalizehist(img)  # matplotlib绘制图片前通道转换  img_rgb = cv2.cvtcolor(img,cv2.color_bgr2rgb) #通道不一致性  ##matplotlib多图绘制在一个面板上  plt.subplot('2,2,1'),plt.imshow(img,cmap=plt.cm.gray),plt.axis('off'),plt.title('original')  plt.subplot('2,2,2'), plt.imshow(img1, cmap = plt.cm.gray), plt.axis('off')  plt.subplot('2,2,3'), plt.hist(img.ravel(),256)  plt.subplot('2,2,4'), plt.hist(img1.ravel(), 256)  

12、图像类型转换

# 彩色图转灰度图  img2 = cv2.cvtcolor(img1, cv2.color_bgr2gray)  # bgr图转rgb图(重点:opencv的通道是 蓝、绿、红跟计算机常用的红、绿、蓝通道相反)  img2 = cv2.cvtcolor(img1, cv2.color_bgr2rgb)  # 灰度图转bgr图,每个通道都是之前的灰度值  img2 = cv2.cvtcolor(img1, cv2.color_gray2bgr)  

13、图像阈值转换 、二值化

r,b = cv2.threshold(img, 127, 255, cv2.thresh_binary) #图像二值化,阈值127,r为返回阈值,b为二值图  r,b = cv2.threshold(img, 127, 255, cv2.thresh_binary_inv) #图像反二值化  r,b = cv2.threshold(img,127,255,cv2.thresh_tozero) #低于threshold则为0  r,b = cv2.threshold(img,127,255,cv2.thresh_tozero_inv) #高于threshold则为0  r,b = cv2.threshold(img,127,255,cv2.thresh_trunc) #截断=>高于threshold则为threshold  

14、图像平滑处理

# 均值滤波  img2 = cv2.blur(img1, (5, 5))  #sum(square)/25  # normalize=1 均值滤波,normalize=0 区域内像素求和  img1 = cv2.boxfilter(img, -1, (2, 2), normalize=1)  # 高斯滤波,第三个参数是方差,默认0计算公式: sigmax=sigmaxy=0.3((ksize-1)*0.5-1)+0.8 (注:卷积核只能是奇数)  img1 = cv2.gaussianblur(img, (3, 3), 0)  #距离像素中心点近的权重较大,以高斯方式往四周分布  # 中值滤波,效果非常好  img1 = cv2.medianblur(img,3)  #获得中心点附近像素排序后的中值  

15、图像形态学操作

(1)图像腐蚀,k为全为1的卷积核

k = np.ones((5,5),np.uint8)  img1 = cv2.dilate(img, k, iterations=2)  

(2)图像膨胀

k = np.ones((5,5),np.uint8)  img1 = cv2.dilate(img, k, iterations=2)  

(3)图像开运算 (先腐蚀后膨胀),去掉图形外侧噪点

k = np.ones((5,5),np.uint8)  img1 = cv2.morphologyex(img, cv2.morph_open, k, iterations=2)  

(4)图像闭运算(先膨胀后腐蚀) ,去掉图形内侧噪点

k = np.ones((5,5),np.uint8)  img1 = cv2.morphologyex(img, cv2.morph_close, k, iterations=2)
# 高帽运算 (原图-开运算),获得图形外噪点  k=np.ones((5,5),np.uint8)  img1 = cv2.morphologyex(img, cv2.morph_tophat, k)  # 黑帽运算(闭运算-原图),获得图像内噪点  k = np.ones((10,10),np.uint8)  img1 = cv2.morphologyex(img, cv2.morph_blackhat, k)  

16、图像梯度,边缘检测

import cv2  import matplotlib.pyplot as plt  import numpy as np  # 各种算子  img = cv2.imread('c:\users\lenovo\desktop\demo.jpg')  img = cv2.cvtcolor(img, cv2.color_bgr2rgb)  img = cv2.gaussianblur(img, (5, 5), 1)  # 高斯平滑  img_median = cv2.medianblur(img, 3)  # 中值滤波  img_gray = cv2.cvtcolor(img_median, cv2.color_bgr2gray)  # roberts 算子  kernelx = np.array([[-1, 0], [0, 1]], dtype=int)  kernely = np.array([[0, -1], [1, 0]], dtype=int)  x = cv2.filter2d(img_gray, cv2.cv_16s, kernelx)  y = cv2.filter2d(img_gray, cv2.cv_16s, kernely)  absx = cv2.convertscaleabs(x)  absy = cv2.convertscaleabs(y)  roberts = cv2.addweighted(absx, 0.5, absy, 0.5, 0)  plt.rcparams['font.sans-serif'] = ['fangsong']  # 支持中文标签  plt.subplot(2,2,1), plt.title("roberts算子"), plt.axis('off')  plt.imshow(roberts,cmap='gray')  # matplotlib 显示彩色图像(rgb格式)  # prewitt 算子  kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]],dtype=int)  kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]],dtype=int)  x = cv2.filter2d(img_gray, cv2.cv_16s, kernelx)  y = cv2.filter2d(img_gray, cv2.cv_16s, kernely)  # 转 uint8 ,图像融合  absx = cv2.convertscaleabs(x)  absy = cv2.convertscaleabs(y)  prewitt = cv2.addweighted(absx, 0.5, absy, 0.5, 0)  plt.subplot(2,2,2), plt.title("prewitt算子"), plt.axis('off')  plt.imshow(prewitt,cmap='gray')  # matplotlib 显示彩色图像(rgb格式)  #sobel算子  # 梯度方向: x  sobelx = cv2.sobel(img_gray, cv2.cv_8u, 1, 0, ksize=3)  sobely = cv2.sobel(img_gray, cv2.cv_8u, 0, 1, ksize=3)  sobel = cv2.addweighted(sobelx,1,sobely,1,0)  plt.subplot(2,2,3), plt.title("sobel算子"), plt.axis('off')  plt.imshow(sobel,cmap='gray')  # matplotlib 显示彩色图像(rgb格式)  #canny算子  binary = cv2.canny(img_gray, 100, 200)  plt.subplot(2,2,4), plt.title("canny算子"), plt.axis('off')  plt.imshow(binary,cmap='gray')  # matplotlib 显示彩色图像(rgb格式)  # matplotlib 显示彩色图像(rgb格式)  # img = cv2.imread("d:/test/26.png", 0)  # laplacian算子  # gray_lap = cv2.laplacian(img, cv2.cv_16s, ksize=3)  # dst = cv2.convertscaleabs(gray_lap) # 转回uint8  plt.show()  

17、图像轮廓标注

gray_img = cv2.cvtcolor(img_1,cv2.color_bgr2gray) #灰度图转化  dep,img_bin = cv2.threshold(gray_img,128,255,cv2.thresh_binary) #二值图转化  image_contours,hierarchy = cv2.findcontours(img_bin,mode=cv2.retr_tree,method = cv2.chain_approx_simple) #获得图像轮廓  to_write = img_1.copy() #原始图像copy,否则会在原图上绘制  ret = cv2.drawcontours(to_write,image_contours,-1,(0,0,255),2) #红笔绘制图像轮廓  plt.subplot(2,1,1),plt.imshow(ret,'gray')  plt.show()

18、读取视频文件

# 数据读取-视频  # cv2.videocapture #可以捕获摄像头,用数字来控制不同的设备,例如0,1。  # 如果是视频文件,直接指定好路径即可  vc = cv2.videocapture("test. mp4")  # 检查是否打开正确  if vc.isopened():  	oepn, frame = vc.reado()  else:       open = false  while open:  	ret, frame = vc.read ()  	if frame is none:  		break  	if ret == true:  		gray = cv2. cvtcolor(frame, cv2.color_bgr2gray)  		cv2.imshow("result", gray)  		if cv2.waitkey(10) & oxff == 27:  			break  vc.release()  cv2.destroyallwindows()

到此这篇关于python-opencv的基本使用的文章就介绍到这了,更多相关python opencv使用内容请搜索<猴子技术宅>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<猴子技术宅>!

需要了解更多python教程分享Python OpenCV的基本使用及相关函数,都可以关注python教程分享栏目—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/pythons/1092000.html

(0)
上一篇 3天前
下一篇 3天前

精彩推荐

发表评论

您的电子邮箱地址不会被公开。