计算机视觉
第七章 综合案例
一、利用OpenCV实现图像校正
1. 任务描述
- 我们对图像中的目标进行分析和检测时,目标往往具有一定的倾斜角度,自然条件下拍摄的图像,完全平正是很少的。因此,需要将倾斜的目标“扶正”的过程就叫做图像矫正。该案例中使用的原始图像如下:
2. 代码
import cv2
import numpy as np
import math
im = cv2.imread("../data/paper.jpg")
cv2.imshow("im", im)
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(im_gray, (5, 5), 0)
dilate = cv2.dilate(blurred, (3, 3))
canny = cv2.Canny(dilate, 30, 120)
cnts, hie = cv2.findContours(canny.copy(),
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
im_cnt = cv2.drawContours(im, cnts, -1, (0, 0, 255), 2)
cv2.imshow("im_cnt", im_cnt)
docCnt = None
if len(cnts) > 0:
cnts = sorted(cnts,
key=cv2.contourArea,
reverse=True)
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02*peri, True)
if len(approx) == 4:
docCnt = approx
break
points = []
for peak in docCnt:
peak = peak[0]
cv2.circle(im,
tuple(peak), 10,
(0, 0, 255), 2)
points.append(peak)
cv2.imshow("im_point", im)
src = np.float32([points[0], points[1], points[2], points[3]])
dst = np.float32([[0, 0], [0, 488], [337, 488], [337, 0]])
m = cv2.getPerspectiveTransform(src, dst)
result = cv2.warpPerspective(im_gray.copy(), m, (337,488))
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
二、利用OpenCV检测芯片瑕疵
1. 任务描述
- 利用图像技术,检测出芯片镀盘区域瑕疵。样本图像中,粉红色区域为镀盘区域,镀盘内部空洞为瑕疵区域,利用图像技术检测镀盘是否存在瑕疵,如果存在则将瑕疵区域标记出来。
2. 思路
- 将原始图像读取出来,做灰度化处理
- 经过灰度化处理以后发现,目标区域的颜色要浅一些,所以做了二值化处理
- 经过二值化处理以后,做了实心的填充,实心化填充之前要取出轮廓
- 实心化填充以后,有瑕疵和没有瑕疵,两张图片的对比就很明显了,所以就做了图像的减法
- 图像减法是求出两幅图像之间的差异,所以就把瑕疵给找了出来
- 经过观察发现,瑕疵区域有一些很小的瑕疵点,没有连接在一起,所以又做了闭运算,先膨胀后腐蚀,把原本没有连在一起的区域连在一起,膨胀以后瑕疵区域会变大,所以又做了腐蚀,把瑕疵区域还原成原来的大小
- 再把瑕疵的轮廓找出来,绘制最小外接圆形,再在原始图像上绘制一个彩色的圆形,这样瑕疵所在的位置就很明显了
- 最后一步,计算瑕疵的面积,瑕疵面积这里可以使用轮廓的面积,使用外接圆的面积,面积大于一定的数值就认为它有瑕疵
3. 代码
import cv2
import numpy as np
import math
im = cv2.imread("../data/CPU3.png")
cv2.imshow("im", im)
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("im_gray", im_gray)
ret, im_bin = cv2.threshold(im_gray, 162, 255, cv2.THRESH_BINARY)
cv2.imshow("im_bin", im_bin)
cnts, hie = cv2.findContours(im_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
mask = np.zeros(im_bin.shape, np.uint8)
im_fill = cv2.drawContours(mask, cnts, -1, (255, 0, 0), -1)
cv2.imshow("im_fill", im_fill)
im_sub = cv2.subtract(im_fill, im_bin)
cv2.imshow("im_sub", im_sub)
k = np.ones((10, 10), np.uint8)
im_close = cv2.morphologyEx(im_sub, cv2.MORPH_CLOSE, k, iterations=3)
cv2.imshow("im_close", im_close)
cnts, hie = cv2.findContours(im_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
(x, y), radius = cv2.minEnclosingCircle(cnts[1])
center = (int(x), int(y))
radius = int(radius)
cv2.circle(im_close, center, radius, (255, 0, 0), 2)
cv2.imshow("im_circle", im_close)
cv2.circle(im, center, radius, (0, 0, 255), 2)
cv2.imshow("im_result", im)
area = math.pi * radius * radius
print("area:", area)
if area > 12:
print("镀盘表明有瑕疵")
cv2.waitKey()
cv2.destroyAllWindows()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
第八章 视频基本处理
一、读取摄像头
import cv2
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
cv2.imshow("frame", frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
二、播放视频文件
import cv2
cap = cv2.VideoCapture("D:\\Alex\\Music\\MV\\2750443843.mp4")
while cap.isOpened():
ret, frame = cap.read()
cv2.imshow("frame", frame)
c = cv2.waitKey(25)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
三、捕获并保存视频
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc("I", "4", "2", "0")
out = cv2.VideoWriter("output.avi",
fourcc,
20,
(640,480))
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
out.write(frame)
cv2.imshow("frame", frame)
if cv2.waitKey(1) == 27:
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
第九章 图像预处理在AI中的应用
- 图像预处理的目的,是让图像数据更适合AI模型进行处理,例如调整大小、颜色
- 通过图像预处理技术,实现数据集的扩充,这种方法称为数据增强。数据增强主要方法有:缩放,拉伸,加入噪点,翻转,旋转,平移,剪切,对比度调整,通道变化。
一、图像数据增强
二、纯图像技术的缺陷
- 到目前为止,我们使用的基本是纯图像技术,对图像大小、颜色、形状、轮廓、边沿进行变换和处理,但这些技术都有一个共同的缺点,即无法理解图像内容和场景,要实现这个目标,必须借助于深度学习技术。