Python OpenCV的基本使用及相关函数
目录
- 1、图像的读取
- 2、图像保存
- 3、图像展示
- 4、获取图像属性
- 5、图像缩放(宽,高)
- 6、在原图像中获取某一区域
- 7、彩色图像通道分解
- 8、图像加法
- 9、图像反转
- 10、图像金字塔
- 11、直方图
- 12、图像类型转换
- 13、图像阈值转换 、二值化
- 14、图像平滑处理
- 15、图像形态学操作
- 16、图像梯度,边缘检测
- 17、图像轮廓标注
- 18、读取视频文件
Python-OpenCV环境的配置看上一篇OpenCV环境的配置
本篇主要介绍一下OpenCV的基本使用和相关函数的介绍。
以下所有操作都基于这三个库:
import cv2
import numpy as np
import matplotlib.pylab as plt
原图
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()
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使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)