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

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

  • 相关阅读:
    Js获取时间,当前,一周前,一月前的时间,时间戳转换,时间格式化,日期格式化
    echarts图随窗口大小的变化而变化
    Vue中使用Google地图插件
    element el-progress渐变色进度条
    Vue中使用mixins
    CSS3 使用 calc() 计算高度 vh px
    element-ui饿了么框架中导航菜单中箭头方向问题
    Vue中使用QRcode.js生成二维码---qrcodejs2
    鼠标经过时显示样式的两种方法
    element 按钮样式:确认按钮发布后样式发生改变
  • 原文地址:https://www.cnblogs.com/zach0812/p/11627048.html
Copyright © 2011-2022 走看看