代码

ImageBasic.ipynb

图像读取

  1. import cv2, math
  2. import numpy as np
  3. ## 定义图像目录
  4. image_directory = 'D:\\Data_documents\\ImageProcess\\images\\'
  5. # 图像读取
  6. imgname = image_directory + 'lena.jpg'
  7. img = cv2.imread(imgname)
  8. # 图像显示在一个新的名字为'image'的窗口中,把窗口最大化后观察图像,在窗口中按任意键关闭窗口
  9. cv2.imshow('image',img)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows()

图像保存

  1. # 图像读取并显示
  2. imgname = image_directory + 'lena.jpg'
  3. img = cv2.imread(imgname)
  4. cv2.imshow('image',img)
  5. # 等待按键
  6. k = cv2.waitKey(0) & 0xFF # 64位系统的处理
  7. # 判断键值,退出或者保存图像
  8. if k == 27: # 按下ESC退出
  9. cv2.destroyAllWindows()
  10. elif k == ord('s'): # 按下's'保存图像到当前目录下
  11. cv2.imwrite('messigray.png', img)
  12. cv2.destroyAllWindows()

像素操作

  1. #不建议的方法
  2. print (img[50,100])
  3. img[50,100] = [255,255,255]
  4. cv2.imshow('image',img)
  5. cv2.waitKey(0)
  6. cv2.destroyAllWindows())
  7. #建议的方法
  8. print (img.item(50,150,2))
  9. img.itemset((50,150,2),0)
  10. print (img.item(50,150,2))
  11. img.itemset((50,150,1),0)
  12. print (img.item(50,150,1))
  13. img.itemset((50,150,0),255)
  14. print (img.item(50,150,0))
  15. cv2.imshow('image',img)
  16. cv2.waitKey(0)
  17. cv2.destroyAllWindows()

ROI

  1. roi = img[280:390,330:440]
  2. # img[273:383,100:210] = roi
  3. img[0:110,0:110] = roi
  4. cv2.imshow('image',img)
  5. cv2.waitKey(0)
  6. cv2.destroyAllWindows()

通道分离

  1. imgname = image_directory + 'lena.jpg'
  2. img = cv2.imread(imgname)
  3. b,g,r=cv2.split(img)
  4. # R 通道保留
  5. b1=b
  6. g1=g
  7. r1=r
  8. ## 这里要制作一个副本,完全拷贝建了一个新的矩阵;如果不用copy,直接赋值,b和b1就是同一个矩阵,会把b1也清零
  9. zerov=b.copy()
  10. zerov[:,:]=0
  11. img=cv2.merge((zerov,zerov,r1))
  12. cv2.imshow('image',img)
  13. cv2.waitKey(0)
  14. cv2.destroyAllWindows()
  15. # G 通道保留
  16. img=cv2.merge((zerov,g1,zerov))
  17. cv2.imshow('image',img)
  18. cv2.waitKey(0)
  19. cv2.destroyAllWindows()
  20. # B 通道保留
  21. img=cv2.merge((b1,zerov,zerov))
  22. cv2.imshow('image',img)
  23. cv2.waitKey(0)
  24. cv2.destroyAllWindows()

图像属性获取

  1. # 读取图像
  2. imgname = image_directory + 'lena.jpg'
  3. img = cv2.imread(imgname)
  4. # 获取图像的大小
  5. size=img.shape
  6. print(size)
  7. row=size[0]
  8. col=size[1]
  9. channel=size[2]
  10. print('图像的行数:')
  11. print(row)
  12. print('图像的列数:')
  13. print(col)
  14. print('图像的通道数:')
  15. print(channel)
  16. # 显示图像的数据类型
  17. print (img.dtype)

图像相加

  1. # 读取图像1 和 图像2
  2. imgname1 = image_directory + 'lena.jpg'
  3. img1 = cv2.imread(imgname1)
  4. imgname2 = image_directory + 'Peppers.tiff'
  5. img2 = cv2.imread(imgname2)
  6. # 显示图像1
  7. cv2.imshow('image',img1)
  8. # 延迟1秒,显示图像2
  9. cv2.waitKey(1000)
  10. cv2.imshow('image',img2)
  11. # 延迟1秒,显示图像1和图像2的叠加
  12. cv2.waitKey(1000)
  13. resimg=cv2.addWeighted(img1,0.5,img2,0.5,0)
  14. cv2.imshow('image',resimg)
  15. # 延迟1秒,关闭窗口
  16. cv2.waitKey(1000)
  17. cv2.destroyAllWindows()

图像拼接

  1. #自带拼接函数
  2. img3 = np.hstack([img1,img2])
  3. img3 = np.vstack([img1,img2])
  4. #自适应大小拼接
  5. def img_joint(image1,image2,direction='h'):
  6. h1,w1,c1 = image1.shape
  7. h2,w2,c2 = image2.shape
  8. if c1 != c2:
  9. print("channels NOT match, cannot merge")
  10. return
  11. elif direction == 'h':
  12. if w1 > w2:
  13. tmp = np.zeros([h2,w1-w2,c1])
  14. image3 = np.hstack([image2,tmp])
  15. image3 = np.vstack([image1,image3])
  16. elif w1 == w2:
  17. image3 = np.vstack([image1,image2])
  18. else:
  19. tmp = np.zeros([h1,w2-w1,c2])
  20. image3 = np.hstack([image1,tmp])
  21. image3 = np.vstack([image3,image2])
  22. return image3
  23. elif direction == 'w':
  24. if h1 > h2:
  25. tmp = np.zeros([h1-h2,w2,c2])
  26. image3 = np.vstack([image2,tmp])
  27. image3 = np.hstack([image1,image3])
  28. elif w1 == w2:
  29. image3 = np.hstack([image1,image2])
  30. else:
  31. tmp = np.zeros([h1-h2,w1,c2])
  32. image3 = np.vstack([image1,tmp])
  33. image3 = np.vstack([image3,image2])
  34. return image3
  35. else:
  36. print('Error!')
  37. return

CV 画图

学习目标函数
cv2.line(), cv2.circle() , cv2.rectangle(), cv2.ellipse(), cv2.putText() etc

参数介绍
img:需要绘制形状的图像
color:颜色的形式. 对于BGR,将作为元组传递比如(255,0,0)表示蓝色.对于灰度图,只需要传递标量值.
thickness:线或圆形等图像的厚度.如果对闭合图像像圆形传递“-1”,它将填充形状. 默认厚度 = 1.
lineType:线的类型.默认情况下,它是8连接的.cv2.LINE_AA 是适合曲线的抗锯齿线.

1 画线

cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
pt1:直线起点
pt2:直线终点
应用
我们将创建一个黑色图像,并在其上从左上角到右下角绘制一条蓝线。
代码 :

  1. import numpy as np
  2. import cv2
  3. img = np.zeros((512,512,3), np.uint8)
  4. cv2.line(img,(0,0),(511,511),(255,0,0),5)
  5. cv2.imshow('line',img)
  6. cv2.waitKey()

2 绘制矩形

cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
pt1:矩形左上角坐标
pt2:矩形右下角坐标
应用
在图像的右上角绘制一个绿色矩形。
代码 :

  1. import numpy as np
  2. import cv2
  3. img = np.zeros((512,512,3), np.uint8)
  4. cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
  5. cv2.imshow('line',img)
  6. cv2.waitKey()

3 画圆

cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
center:圆心位置
radius:半径
应用
在上面绘制的矩形内绘制一个圆。
代码 :

  1. import numpy as np
  2. import cv2
  3. img = np.zeros((512,512,3), np.uint8)
  4. cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
  5. cv2.circle(img,(447,63), 63, (0,0,255), -1)
  6. cv2.imshow('line',img)
  7. cv2.waitKey()

4 绘制椭圆

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
center:中心位置
axes:轴长度(长轴长度,短轴长度)
angle:椭圆在逆时针方向上的旋转角度
startAngle:主轴顺时针方向测量的椭圆弧的起点
endAngle:主轴顺时针方向测量的椭圆弧的终点
应用
在图像的中心绘制一个半椭圆。
代码 :

  1. import numpy as np
  2. import cv2
  3. img = np.zeros((512,512,3), np.uint8)
  4. cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
  5. cv2.imshow('line',img)
  6. cv2.waitKey()

5 绘制多边形

cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
要绘制多边形,首先需要顶点坐标.将这些点转换为ROWSx1x2形状的数组,其中ROWS是顶点数,它应该是int32类型.
应用
绘制一个带有四个黄色顶点的小多边形.
代码 :

  1. import numpy as np
  2. import cv2
  3. img = np.zeros((512,512,3), np.uint8)
  4. pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
  5. pts = pts.reshape((-1,1,2))
  6. cv2.polylines(img,[pts],True,(0,255,255))
  7. cv2.imshow('line',img)
  8. cv2.waitKey()

Note:
如果第三个参数为False,您将获得连接所有点的折线,而不是闭合形状.
cv2.polylines()可用于绘制多条线.只需创建要绘制的所有行的列表并将其传递给函数, 所有线条都将单独绘制.绘制一组行比为每行调用cv2.line()要好得多,速度更快.

6 向图像添加文字

向图像添加文字:
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
要将文本放入图像中,您需要指定以下内容。

text:要写入的文本数据
org:您想要放置它的位置坐标(即数据开始的左下角)。
fontFace:字体类型(检查cv2.putText()文档以获取支持的字体)
fontScale:字体比例(指定字体大小)
常规的东西,如颜色,粗细,线型等。为了更好看,建议使用lineType = cv.LINE_AA。
我们将在图像上写白色的opencv几个字母.
代码 :

  1. import numpy as np
  2. import cv2
  3. img = np.zeros((512,512,3), np.uint8)
  4. font = cv2.FONT_HERSHEY_SIMPLEX
  5. cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)
  6. cv2.imshow('show',img)
  7. cv2.waitKey()

知识点

2.1 视觉与图像感知

2.2 图像获取

  1. 采集装置
  2. 图像数字化
  3. 黑白图像
  4. 灰度图像
  5. 彩色图像

    2.3像素间的基本关系

  6. 图像放大与缩小

  7. m邻接
  8. 连通性
  9. 区域与边界

    2.4 图像处理基础

    image.png

    课件

    机器视觉-第2章-数字图像基础.pdf
    机器视觉-第2章-数字图像基础-2.pdf