opencv一个强大的图像处理和计算机视觉库(基础知识)

一、opencv是什么

OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。

  • OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库
  • OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持
  • OpenCV可用于开发实时的图像处理,计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用

二、图像的基本操作

1.opencv简单图像处理:

图像在计算机中存储形式:

  对于只有黑白颜色的灰度图,为单通道,一个像素块对应矩阵中一个数字,数值为0到255, 其中 0表示最暗(黑色) ,255表示最亮(白色)

      对于采用RGB模式的彩色图片,为三通道图,Red、Green、Blue三原色,按不同比例相加,一个像素块对应矩阵中的一个向量, 如[24,180, 50],分别表示三种颜色的比列, 即对应深度上的数字,但opencv采用BGR模式,而不是RGB

opencv一个强大的图像处理和计算机视觉库(基础知识)_第1张图片

opencv一个强大的图像处理和计算机视觉库(基础知识)_第2张图片

 2.图像的读取与写入

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: 需要关闭的窗口名字,不传入时关闭所有窗口

cv2.imwrite()图片的写入

imwrite(img_path_name,img)
    img_path_name:保存的文件名
    img:文件对象

3.图像像素获取和编辑

像素值获取
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))

4.添加边界(padding) 

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]

opencv一个强大的图像处理和计算机视觉库(基础知识)_第3张图片

5.像素算术运算

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]

opencv一个强大的图像处理和计算机视觉库(基础知识)_第4张图片opencv一个强大的图像处理和计算机视觉库(基础知识)_第5张图片

 无掩膜                                             有掩膜

cv.addWeight(): 两张图片相加,分别给予不同权重,实现图片融合和透明背景等效果

cv2.addWeighted() 两张图片相加,分别给予不同权重,实现图片融合和透明背景等效果
    参数:
        img1:图片对象1
        alpha:img1的权重
        img2:图片对象2
        beta:img1的权重
        gamma:常量值,图像相加后再加上常量值
        dtype:返回图像的数据类型,默认为-1,和img1一样
    (img1*alpha+img2*beta+gamma)

opencv一个强大的图像处理和计算机视觉库(基础知识)_第6张图片

6.图像位运算

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:掩膜

opencv一个强大的图像处理和计算机视觉库(基础知识)_第7张图片

7 图像颜色空间转换

 cv2.cvtColor()

8 性能评价 

cv2.getTickCount(): 获得时钟次数

cv2.getTickFrequency():获得时钟频率 (每秒振动次数)

9 绑定trackbar到图像

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: 窗口的名字

opencv一个强大的图像处理和计算机视觉库(基础知识)_第8张图片

你可能感兴趣的:(opencv)