强大的图像处理和计算机视觉库,实现了很多实用算法
opencv-python包(非官方):
pip install opencv-python
官方文档:https://opencv-python-tutroals.readthedocs.io/en/latest/
首先得了解下图像在计算机中存储形式:
(为了方便画图,每列像素值都写一样了)
对于只有黑白颜色的灰度图,为单通道,
一个像素块对应矩阵中一个数字,数值为0到255,
其中0表示最暗(黑色) ,255表示最亮(白色)
对于采用RGB模式的彩色图片,为三通道图,
Red、Green、Blue三原色,
按不同比例相加,
一个像素块对应矩阵中的一个向量, 如[24,180, 50],
分别表示三种颜色的比列,
即对应深度上的数字,如下图所示:
需要注意的是,由于历史遗留问题,opencv采用BGR模式,而不是RGB
imread(img_path,flag) 读取图片,返回图片对象 img_path: 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None flag:cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1 cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0 cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1
imshow(window_name,img):显示图片,窗口自适应图片大小 window_name: 指定窗口的名字 img:显示的图片对象 可以指定多个窗口名称,显示多个图片 waitKey(millseconds) 键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同) millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0时,会一直等待键盘事件 destroyAllWindows(window_name) window_name: 需要关闭的窗口名字,不传入时关闭所有窗口
imwrite(img_path_name,img) img_path_name:保存的文件名 img:文件对象
#coding:utf-8 import cv2 img = cv2.imread(r"C:\Users\Administrator\Desktop\roi.jpg") # print(img.shape) img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,img_threshold = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY) cv2.imshow("img",img) cv2.imshow("thre",img_threshold) key = cv2.waitKey(0) if key==27: #按esc键时,关闭所有窗口 print(key) cv2.destroyAllWindows() cv2.imwrite(r"C:\Users\Administrator\Desktop\thre.jpg",img_threshold)
img = cv2.imread(r"C:\Users\Administrator\Desktop\roi.jpg") #获取和设置 pixel = img[100,100] #[57 63 68],获取(100,100)处的像素值 img[100,100]=[57,63,99] #设置像素值 b = img[100,100,0] #57, 获取(100,100)处,blue通道像素值 g = img[100,100,1] #63 r = img[100,100,2] #68 r = img[100,100,2]=99 #设置red通道值 #获取和设置 piexl = img.item(100,100,2) img.itemset((100,100,2),99)
import cv2 img = cv2.imread(r"C:\Users\Administrator\Desktop\roi.jpg") #rows,cols,channels img.shape #返回(280, 450, 3), 宽280(rows),长450(cols),3通道(channels) #size img.size #返回378000,所有像素数量,=280*450*3 #type img.dtype #dtype('uint8')
#ROI,Range of instrest roi = img[100:200,300:400] #截取100行到200行,列为300到400列的整块区域 img[50:150,200:300] = roi #将截取的roi移动到该区域 (50到100行,200到300列) b = img[:,:,0] #截取整个蓝色通道 b,g,r = cv2.split(img) #截取三个通道,比较耗时 img = cv2.merge((b,g,r))
cv2.copyMakeBorder() 参数: img:图像对象 top,bottom,left,right: 上下左右边界宽度,单位为像素值 borderType: cv2.BORDER_CONSTANT, 带颜色的边界,需要传入另外一个颜色值 cv2.BORDER_REFLECT, 边缘元素的镜像反射做为边界 cv2.BORDER_REFLECT_101/cv2.BORDER_DEFAULT cv2.BORDER_REPLICATE, 边缘元素的复制做为边界 CV2.BORDER_WRAP value: borderType为cv2.BORDER_CONSTANT时,传入的边界颜色值,如[0,255,0]
#coding:utf-8 import cv2 as cv import matplotlib.pyplot as plt img2 = cv.imread(r"C:\Users\Administrator\Desktop\dog.jpg") img = cv.cvtColor(img2,cv.COLOR_BGR2RGB) #matplotlib的图像为RGB格式 constant = cv.copyMakeBorder(img,20,20,20,20,cv.BORDER_CONSTANT,value=[0,255,0]) #绿色 reflect = cv.copyMakeBorder(img,20,20,20,20,cv.BORDER_REFLECT) reflect01 = cv.copyMakeBorder(img,20,20,20,20,cv.BORDER_REFLECT_101) replicate = cv.copyMakeBorder(img,20,20,20,20,cv.BORDER_REPLICATE) wrap = cv.copyMakeBorder(img,20,20,20,20,cv.BORDER_WRAP) titles = ["constant","reflect","reflect01","replicate","wrap"] images = [constant,reflect,reflect01,replicate,wrap] for i in range(5): plt.subplot(2,3,i+1),plt.imshow(images[i]),plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
https://www.cnblogs.com/silence-cho/p/10926248.html