OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。
图像在计算机中存储形式:
对于只有黑白颜色的灰度图,为单通道,一个像素块对应矩阵中一个数字,数值为0到255, 其中 0表示最暗(黑色) ,255表示最亮(白色)。
对于采用RGB模式的彩色图片,为三通道图,Red、Green、Blue三原色,按不同比例相加,一个像素块对应矩阵中的一个向量, 如[24,180, 50],分别表示三种颜色的比列, 即对应深度上的数字,但opencv采用BGR模式,而不是RGB。
cv2.imread() 图片的读取
imread(img_path,flag) 读取图片,返回图片对象 img_path: 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None flag:cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1 cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0 cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1
cv2.imshow()图片的显示
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:文件对象
像素值获取 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 Interest)
#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]
cv2.add() 相加的两个图片,应该有相同的大小和通道
cv2.add() 参数: img1:图片对象1 img2:图片对象2 mask:None (掩膜,一般用灰度图做掩膜,img1和img2相加后,和掩膜与运算,从而达到掩盖部分区域的目的) dtype:-1 注意:图像相加时应该用cv2.add(img1,img2)代替img1+img2 >>> x = np.uint8([250]) >>> y = np.uint8([10]) >>> print cv2.add(x,y) # 250+10 = 260 => 255 #相加,opencv超过255的截取为255 [[255]] >>> print x+y # 250+10 = 260 % 256 = 4 #相加,np超过255的会取模运算 (uint8只能表示0-255,所以取模) [4]无掩膜 有掩膜
cv.addWeight(): 两张图片相加,分别给予不同权重,实现图片融合和透明背景等效果
cv2.addWeighted() 两张图片相加,分别给予不同权重,实现图片融合和透明背景等效果 参数: img1:图片对象1 alpha:img1的权重 img2:图片对象2 beta:img1的权重 gamma:常量值,图像相加后再加上常量值 dtype:返回图像的数据类型,默认为-1,和img1一样 (img1*alpha+img2*beta+gamma)
btwise_and(), bitwise_or(), bitwise_not(), bitwise_xor()
cv2.btwise_and(): 与运算 参数: img1:图片对象1 img2:图片对象2 mask:掩膜 cv2.bitwise_or():或运算 参数: img1:图片对象1 img2:图片对象2 mask:掩膜 cv2.bitwise_not(): 非运算 img1:图片对象1 mask:掩膜 cv2.bitwise_xor():异或运算,相同为1,不同为0(1^1=0,1^0=1) img1:图片对象1 img2:图片对象2 mask:掩膜
cv2.cvtColor()
cv2.getTickCount(): 获得时钟次数
cv2.getTickFrequency():获得时钟频率 (每秒振动次数)
cv2.createTrackbar()
cv2.getTrackbarPos()
cv2.createTrackbar() 为窗口添加trackbar 参数: trackbarname: trackbar的名字 winname: 窗口的名字 value: trackbar创建时的值 count:trackbar能设置的最大值,最小值总为0 onChange:trackbar值发生变化时的回调函数,trackbar的值作为参数传给onchange cv2.getTrackbarPos() 获取某个窗口中trackbar的值 参数: trackbarname: trackbar的名字 winname: 窗口的名字