zoukankan      html  css  js  c++  java
  • OpenCV 基础_01

    第一章:基础操作:

    openCV画图:

     1 from imutils import *   #这是封装到一个模块imutils
     2 
     3 image = np.zeros((300,300,3),dtype='uint8')
     4 # show(image)  #它是个黑色的图片
     5 
     6 #画线
     7 if 0:
     8     red = (255,0,0)
     9     cv2.line(image,(0,0),(300,300),red)
    10     # show(image)
    11 
    12     blue = (0,0,255)
    13     cv2.line(image,(300,0),(150,150),blue,5) #最后一个参数为线的宽度
    14     show(image)
    15     pass
    16 
    17 #画矩形
    18 if 0:
    19     red = (255,0,0)
    20     cv2.rectangle(image,(10,10),(100,100),red,2) #最后一个参数为线宽(注:如果最后一个参数为-1 ,则是填充)
    21     show(image)
    22     pass
    23 
    24 #画圆
    25 if 1:
    26     if 0:
    27         image = np.zeros((300,300,3),dtype='uint8')#它是个黑色的图片
    28         cx,cy = image.shape[1]//2,image.shape[0]//2
    29         white = (255,255,255)
    30         for i in range(0,151,15):
    31             cv2.circle(image,(cx,cy),i,white)
    32         show(image)
    33         pass
    34 
    35     if 0:
    36         image = np.zeros((300,300,3),dtype='uint8')
    37         cx,cy = image.shape[1]//2 ,image.shape[0]//2
    38         #随机画十个圆
    39         for _ in range(10):
    40             radius  = np.random.randint(5,151)
    41             #颜色
    42             color = np.random.randint(0,256,size=(3,)).tolist()
    43             cv2.circle(image,(cx,cy),radius,color)
    44         show(image)
    45         pass
    46     if 1:
    47         image = np.zeros((300,300,3),dtype='uint8')
    48         #随机画十个圆 (圆心也不固定,而且填充圆)
    49         for _ in range(20):
    50             radius  = np.random.randint(5,151)
    51             #颜色
    52             color = np.random.randint(0,256,size=(3,)).tolist()
    53             #圆心
    54             point = np.random.randint(0,300,size=(2,))
    55 
    56             cv2.circle(image,tuple(point),radius,color,-1)
    57 
    58         show(image)
    59         pass
    60     pass
    View Code
     1 #成批自动绘制图片 并保存到本地
     2 for i in range(10):
     3     #画圆
     4     image = np.zeros((300,300,3),dtype='uint8')
     5     #随机画十个圆 (圆心也不固定,而且填充圆)
     6     for _ in range(30):
     7         radius  = np.random.randint(5,151)
     8         #颜色
     9         color = np.random.randint(0,256,size=(3,)).tolist()
    10         #圆心
    11         point = np.random.randint(0,300,size=(2,))
    12         cv2.circle(image,tuple(point),radius,color,-1)
    13 
    14     show(image)
    15     cv2.imwrite("d:/images/circle_{}.png".format(i),image)
    自动生成图片

    第二章:几何变换:

    翻转:

    它主要有三种:水平 ,垂直 和 水平+垂直

    函数是 cv2.flip(src,flipCode)

    其中的flipCode取值为  0 1 ,-1 

    0 是 垂直翻转 ,1 是水平翻转      -1 是水平加垂直

     1 from imutils import *
     2 
     3 image = imread("d:/images/test.jpg")
     4 # show(image)
     5 
     6 #水平翻转
     7 if 0:
     8     image = cv2.flip(image,1)
     9     show(image)
    10 
    11 
    12 #垂直翻转
    13 if 0:
    14     image = cv2.flip(image,0)   # 0 表示垂直翻转
    15     show(image)
    16 
    17 #水平+ 垂直 翻转
    18 if 1:
    19     image = cv2.flip(image,-1) # 水平加垂直
    20     show(image)
    View Code

    裁剪:

    1 from imutils import *
    2 
    3 image = imread("d:/images/test.jpg")
    4 #对图片进行裁剪
    5 image = image[:200,50:200]  #裁剪
    6 show(image)
    View Code

    图像算术(图像的加减法):

     1 from imutils import *
     2 
     3 image = imread("d:/images/test.jpg")
     4 
     5 #图像加法
     6 if 0:
     7     # print(np.uint8([200]))
     8     #图像加法
     9     res = cv2.add(np.uint8([200]),np.uint8([100]))
    10     print(res)  #最大是255
    11 
    12     #普通加法
    13     res = np.uint8([200]) +np.uint8([100])
    14     print(res)  #44  此时已经溢位
    15 
    16     pass
    17 
    18 #图像减法
    19 if 0:
    20     #图像减法
    21     res = cv2.subtract(np.uint8([50]),np.uint8([100]))
    22     print(res)  #最小是0
    23 
    24     #普通减法
    25     res = np.uint8([50]) -np.uint8([100])
    26     print(res)  #[206] 此时已经溢位
    27 
    28     pass
    29 
    30 
    31 #给图片的每个像素都加100
    32 if 1:
    33     #生成和 image 一样的数据
    34     M = np.ones(image.shape,dtype='uint8')*100
    35 
    36     #给image 的像素值都家加上100
    37     image_new = cv2.add(image,M)
    38     show(image_new)  #可以观察到图片变白了,因为加上值,所以整体数值偏大
    39     pass
    40 
    41 #给图片的每个像素都减100
    42 if 1:
    43     #生成和 image 一样的数据
    44     M = np.ones(image.shape,dtype='uint8')*100
    45 
    46     #给image 的像素值都家减去100
    47     image_new = cv2.subtract(image,M)
    48     show(image_new)  #可以观察到图片变黑了,因为整体数值偏像0
    49     pass
    View Code

    按位计算:

    四种常见的按位计算:

    与  或  非  异或

    其中的异或是:当两个数相同时为0 ,不同时为1

     1 from imutils import *
     2 
     3 image1 = np.zeros((300,300,3),dtype='uint8')
     4 
     5 #画个白色的矩形
     6 white = (255,255,255)
     7 cv2.rectangle(image1,(25,25),(275,275),white,-1) #填充
     8 # show(image1) #矩形
     9 
    10 image2 = np.zeros(image1.shape,dtype='uint8')
    11 cv2.circle(image2,(150,150),150,white,-1)
    12 # show(image2)  #圆
    13 if 1:
    14     # 与 有黑就变黑    0是黑 1 是白
    15     image3 =cv2.bitwise_and(image1,image2)
    16     # show(image3)
    17 
    18     # 或  有白就变白    0是黑 1 是白
    19     image4 =cv2.bitwise_or(image1,image2)
    20     # show(image4)
    21 
    22     # 非  黑白交换
    23     image5 =cv2.bitwise_not(image1)
    24     image6 =cv2.bitwise_not(image2)
    25     # show(image5)
    26     # show(image6)
    27 
    28 
    29     # 异或  相同为0 相同为黑 ,不同为白
    30     image7 = cv2.bitwise_xor(image1,image2)
    31     # show(image7)
    View Code

    遮挡:

    利按位计算来进行遮挡 。

     1 from imutils import *
     2 
     3 image = imread("d:/images/test.jpg")
     4 
     5 # show(image)
     6 if 0:
     7     #创建矩形遮挡
     8     mask = np.zeros(image.shape,dtype='uint8')
     9     cv2.rectangle(mask,(50,50),(250,350),(255,255,255),-1)
    10     # show(mask)
    11 
    12     #对图片进行遮挡  #有黑 必有黑
    13     image_new = cv2.bitwise_and(image,mask)
    14     show(image_new)
    15     pass
    16 if 1:
    17     #创建圆形遮挡
    18     mask = np.zeros(image.shape,dtype='uint8')
    19     cv2.circle(mask,(150,150),100,(255,255,255),-1)
    20     show(mask)
    21 
    22     # 对图片进行遮挡  #有黑 必有黑
    23     image_new = cv2.bitwise_and(image,mask)
    24     show(image_new)
    25 
    26     pass
    View Code

    切分合并通道:

     1 from imutils import *
     2 
     3 image = imread("d:/images/test.jpg")
     4 
     5 #切分颜色通道
     6 R,G,B = cv2.split(image)
     7 
     8 #用openCV 自己的imshow()显示R  G  B 
     9 cv2.imshow('R',R)  #它们都是黑白图片因为它们都是单通道的图片
    10 cv2.imshow('G',G)
    11 cv2.imshow('B',B)
    12 cv2.waitKey(0)
    13 cv2.destroyAllWindows()
    14 
    15 print(R.shape)
    16 print(G.shape)
    17 print(B.shape)
    18 
    19 #合并颜色通道
    20 image = cv2.merge([R,G,B])
    21 # show(image)
    View Code

    图像金字塔:

    它不是一种具体的算法,而是一种处理图片的思想,

     1 from imutils import *
     2 
     3 image = imread("d:/images/image.jpg")
     4 # print(image.shape) #原始图片大小 (424, 600, 3)
     5 # show(image)
     6 
     7 #进行高斯金字塔 降低分辨率  #和resize 其实是差不多的,
     8 if 0:
     9     for i in range(4):
    10         image = cv2.pyrDown(image)
    11         print(image.shape)
    12         show(image)
    13     '''
    14     输出:
    15     (212, 300, 3)
    16     (106, 150, 3)
    17     (53, 75, 3)
    18     (27, 38, 3)
    19     四个图片变得越来越模糊 
    20     '''
    21     pass
    22 
    23 #进行高斯金字塔 提高分辨率
    24 if 0:
    25     for i in range(4):
    26         image = cv2.pyrUp(image)
    27         print(image.shape)
    28         show(image)
    29         pass
    30     '''
    31     输出
    32     (848, 1200, 3)
    33     (1696, 2400, 3)
    34     (3392, 4800, 3)
    35     (6784, 9600, 3)
    36     '''
    37 
    38     pass
    39 
    40 #拉普拉斯金字塔  它主要是用来提取物体的边界轮廓
    41 if 1:
    42     down_image1 = cv2.pyrDown(image)
    43     down_image2 = cv2.pyrDown(down_image1) #两次高斯金字塔
    44 
    45     up_image = cv2.pyrUp(down_image2)
    46     lp  = down_image1 -up_image
    47     show(lp)
    48     #上面相当于做了一次拉普拉斯金字塔
    49     pass
    高斯金字塔和拉普拉斯金字塔

    第三章:形态学:

    卷积的简单介绍:

    Erosion腐蚀(消除白点)

    其原理是在原图的小区域内取局部最小值,其函数是cv2.erode()。这个核也叫结构元素,因为形态学操作其实也是应用卷积来实现的,结构元素可以是矩形/椭圆/十字形,可以用cv2.getStructuringElement()来生成不同形状的结构元素,比如:

    腐蚀黑色的会变多

     1 from imutils import *
     2 
     3 #使用cv2.getStructuringElement生成不同形状的结构元素
     4 #矩形
     5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
     6 
     7 #椭圆
     8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
     9 
    10 #十字形
    11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
    12 
    13 image = imread("d:/images/image.jpg")
    14 # show(image)
    15 
    16 
    17 #使用 cv2.erode() 来对图片进行腐蚀
    18 if 0:
    19     image_new1 = cv2.erode(image,kernel1) #用矩形核 来进行腐蚀
    20     show(image_new1)
    21 
    22     pass
    23 
    24 if 1:
    25     #多次腐蚀
    26     for i in range(3):
    27         image_new1 =cv2.erode(image,kernel1,iterations=i+1) #第一次腐蚀1次,第二次腐蚀2次,第三次腐蚀3次
    28         show(image_new1)
    29     pass
    30 
    31 
    32 
    33 # image_new2 = cv2.erode(image,kernel2)
    34 # show(image_new2)
    35 #
    36 # image_new3 = cv2.erode(image,kernel3)
    37 # show(image_new3)
    View Code

    膨胀白色的会变多

     1 from imutils import *
     2 
     3 #使用cv2.getStructuringElement生成不同形状的结构元素
     4 #矩形
     5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
     6 
     7 #椭圆
     8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
     9 
    10 #十字形
    11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
    12 
    13 image = imread("d:/images/image.jpg")
    14 # show(image)
    15 
    16 
    17 #使用 cv2.dilate() 来对图片进行腐蚀
    18 if 1:
    19     image_new1 = cv2.dilate(image,kernel1) #用矩形核 来进行腐蚀
    20     show(image_new1)
    21     pass
    View Code

    膨胀和腐蚀的区别就是函数不同!

     1 from imutils import *
     2 
     3 #使用cv2.getStructuringElement生成不同形状的结构元素
     4 #矩形
     5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
     6 
     7 #椭圆
     8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
     9 
    10 #十字形
    11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
    12 
    13 image = imread("d:/images/image2.jpg")
    14 show(image)
    15 
    16 #使用 cv2.morphologyEx()进行开运算(morph_open) 和 闭运算(morph_close)
    17 image_new = cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel1)
    18 show(image_new) #发现黑点消失了
    View Code

    先做开运算再做闭运算:(先去除白点,再去除黑点)

     1 from imutils import *
     2 
     3 #使用cv2.getStructuringElement生成不同形状的结构元素
     4 #矩形
     5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
     6 
     7 #椭圆
     8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
     9 
    10 #十字形
    11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
    12 
    13 image = imread("d:/images/image2.jpg")
    14 show(image)
    15 
    16 #使用 cv2.morphologyEx()进行开运算(morph_open) 和 闭运算(morph_close)
    17 image_opening = cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel1)
    18 image_closing = cv2.morphologyEx(image_opening,cv2.MORPH_CLOSE,kernel1)
    19 show(image_closing)
    View Code

    但是,它们带来的影响是图片相较原图,会变得模糊一些!!!

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/zach0812/p/11627048.html
Copyright © 2011-2022 走看看