Python-OpenCV基本操作cv2
1.图片加载、显示和保存
import cv2 # 生成图片 img = cv2.imread("1.jpg") # 生成灰色图片 imgGrey = cv2.imread("1.jpg", 0) # 展示原图 cv2.imshow("img", img) # 展示灰色图片 cv2.imshow("imgGrey", imgGrey) # 等待图片的关闭 cv2.waitKey() # 保存灰色图片 cv2.imwrite("Copy.jpg", imgGrey)
2.图像显示窗口创建与销毁
cv2.namedWindow(窗口名,属性) 创建一个窗口
属性—指定窗口大小模式:
cv2.WINDOW_AUTOSIZE:根据图像大小自动创建大小
cv2.WINDOW_NORMAL:窗口大小可调整
cv2.destoryAllWindows(窗口名) 删除任何建立的窗口
import cv2 img = cv2.imread("1.jpg") cv2.namedWindow("img", cv2.WINDOW_NORMAL) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
3.图片宽、高、通道数获取
img.shape 返回图像高(图像矩阵的行数)、宽(图像矩阵的列数)和通道数3个属性组成的元组,若图像是非彩色图,则只返回高和宽组成的元组。
import cv2 img = cv2.imread("1.jpg") imgGrey = cv2.imread("1.jpg", 0) sp1 = img.shape sp2 = imgGrey.shape print(sp1) print(sp2)
# ======输出=======
#(1200, 1920, 3)
#(1200, 1920)
4.图像像素数目和图像数据类型的获取
图像矩阵img的size属性和dtype分别对应图像的像素总数目和图像数据类型。一般情况下,图像的数据类型是uint8。
import cv2 img = cv2.imread("1.jpg") imgSize = img.size print(imgSize) ty = img.dtype print(ty)
#======输出========
#6912000
#uint8
5 生成指定大小的空图像
生成指定大小的空图像
import cv2 import numpy as np img = cv2.imread("1.jpg") imgZero = np.zeros(img.shape, np.uint8) imgFix = np.zeros((300, 500, 3), np.uint8) # imgFix = np.zeros((300,500),np.uint8) cv2.imshow("img", img) cv2.imshow("imgZero", imgZero) cv2.imshow("imgFix", imgFix) cv2.waitKey()
6. 访问和操作图像像素
OpenCV中图像矩阵的顺序是B、G、R。可以直接通过坐标位置访问和操作图像像素。
import cv2 img = cv2.imread("01.jpg") numb = img[50,100] print numb img[50,100] = (0,0,255) cv2.imshow("img",img) cv2.waitKey()
分开访问图像某一通道像素值也炒鸡方便:
import cv2 img = cv2.imread("01.jpg") img[0:100,100:200,0] = 255 img[100:200,200:300,1] = 255 img[200:300,300:400,2] = 255 cv2.imshow("img",img) cv2.waitKey()
嗯,不得不说Python是一个很神奇的存在。
Python中,更改图像某一矩形区域的像素值也很方便:
import cv2 img = cv2.imread("01.jpg") img[0:50,1:100] = (0,0,255) cv2.imshow("img",img) cv2.waitKey()
7. 图像三通道分离和合并
分离图像通道可以使用cv2中的split函数,合并使用merge函数。
import cv2 img = cv2.imread("01.jpg") b , g , r = cv2.split(img) # b = cv2.split(img)[0] # g = cv2.split(img)[1] # r = cv2.split(img)[2] merged = cv2.merge([b,g,r]) cv2.imshow("Blue",b) cv2.imshow("Green",g) cv2.imshow("Red",r) cv2.imshow("Merged",merged) cv2.waitKey()
8. 在图像上输出文字
使用putText函数在图片上输出文字,函数原型:
putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
- img: 图像
- text:要输出的文本
- org: 文字的起点坐标
- fontFace: 字体
- fontScale: 字体大小
- color: 字体颜色
- thickness: 字图加粗
import cv2 img = cv2.imread("01.jpg") cv2.putText(img,"Print some text to img",(100,100),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255)) cv2.imshow("img",img) cv2.waitKey()
9. 图像缩放
缩放使用cv2.resize()函数,resize函数里的size第一个是宽(列),第二个是高(行)。
import cv2 img = cv2.imread("1.jpg") cv2.imshow("img", img) imgg = cv2.resize(img, (200, 100)) cv2.imshow("imgg", imgg) cv2.waitKey()
10.图片灰化处理
# from matplotlib import pyplot as plt # import cv2 # from pylab import * # # # 添加中文字体支持 # from matplotlib.font_manager import FontProperties # font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc",size = 14) # # # 载入图像 # im = cv2.imread('1.jpg') # # 显示原始图像 # fig = plt.figure() # subplot(121) # plt.gray() # im2 = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) #OpenCV采用BGR排列顺序,需要转换一下. # imshow(im2) # title(u'彩色图', fontproperties= font) # axis('off') # # 显示灰度化图像 # # 颜色空间转换 # gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # plt.subplot(122) # plt.gray() # imshow(gray) # title(u'灰度图', fontproperties= font) # axis('off') # show()
转换后的结果
11.在python3 下使用OpenCV抓取摄像头图像提取蓝色
import cv2 import numpy as np cap = cv2.VideoCapture(0) for i in range(0, 19): print(cap.get(i)) while(1): ret, frame = cap.read() hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_blue = np.array([100, 47, 47]) upper_blue = np.array([124, 255,255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) #蓝色掩模 res = cv2.bitwise_and(frame, frame, mask = mask) cv2.imshow(u"Capture", frame) cv2.imshow(u"mask", mask) cv2.imshow(u"res", res) key = cv2.waitKey(1) if key & 0xff == ord('q') or key == 27: print(frame.shape,ret) break cap.release() cv2.destroyAllWindows()
以下是从wangyblzu博客截下来的HSV颜色分量范围
https://www.cnblogs.com/wangyblzu/p/5710715.html
三张结果图