案例一 纸张变正
fig, axes = plt.subplots(1, 5, figsize=(15, 15))
img = cv2.imread('../data/paper.jpg', 1)[..., ::-1]
axes[0].imshow(img)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
axes[1].imshow(gray, cmap=plt.get_cmap('gray'))
bluerd = cv2.GaussianBlur(gray, (5, 5), 0)
k = np.ones((3, 3), np.uint8)
r1 = cv2.morphologyEx(bluerd, cv2.MORPH_CLOSE, k, iterations=3)
canny = cv2.Canny(r1,
30,
120)
t, binary = cv2.threshold(canny, 200, 255, cv2.THRESH_BINARY)
axes[2].imshow(binary, cmap=plt.get_cmap('gray'))
cnts, hie = cv2.findContours(binary,
mode=cv2.RETR_EXTERNAL,
method=cv2.CHAIN_APPROX_SIMPLE)
doccnt = None
if len(cnts) > 0:
sorted(cnts,
key=cv2.contourArea,
reverse=True)
for cnt in cnts:
eps = 0.02 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, eps, True)
if len(approx) == 4:
doccnt = approx
break
print(doccnt)
points = []
for peak in doccnt:
peak = peak[0]
cv2.circle(gray, tuple(peak), 30, (0, 0, 0), 4)
points.append(peak)
src = np.array(points, dtype='float32')
h = int(math.sqrt((src[0][0] - src[1][0]) ** 2 + (src[0][1] - src[1][1]) ** 2))
w = int(math.sqrt((src[0][0] - src[3][0]) ** 2 + (src[0][1] - src[3][1]) ** 2))
dst = np.float32([[0, 0],
[0, h],
[w, h],
[w, 0]])
M = cv2.getPerspectiveTransform(src, dst)
res = cv2.warpPerspective(img, M, (w, h))
axes[4].imshow(res)
img_cnt = cv2.drawContours(gray,
cnts[0],
-1,
(0, 0, 0),
6)
axes[3].imshow(img_cnt, cmap=plt.get_cmap('gray'))
plt.show()
案例二 芯片找瑕疵
fig, axes = plt.subplots(2, 4, figsize=(15, 15))
img = cv2.imread('../data/CPU3.png', 1)[..., ::-1]
axes[0][0].imshow(img)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
axes[0][1].imshow(gray, cmap=plt.get_cmap('gray'))
t, binary = cv2.threshold(gray, 169, 255, cv2.THRESH_BINARY)
axes[0][2].imshow(binary, cmap=plt.get_cmap('gray'))
cnts, hie = cv2.findContours(binary,
mode=cv2.RETR_EXTERNAL,
method=cv2.CHAIN_APPROX_NONE)
mask = np.zeros_like(binary)
img_fill = cv2.drawContours(mask, cnts,
-1,
(255, 0, 0),
-1)
axes[0][3].imshow(img_cnt, cmap=plt.get_cmap('gray'))
img_sub = cv2.subtract(img_fill, binary)
axes[1][0].imshow(img_sub, cmap=plt.get_cmap('gray'))
k = np.ones((3, 3), np.uint8)
close = cv2.morphologyEx(img_sub, cv2.MORPH_CLOSE, k, iterations=2)
axes[1][1].imshow(close, cmap=plt.get_cmap('gray'))
cnts, hie = cv2.findContours(close,
mode=cv2.RETR_EXTERNAL,
method=cv2.CHAIN_APPROX_NONE)
doccnt = None
if len(cnts) > 0:
sorted(cnts,
key=cv2.contourArea,
reverse=True)
center, radius = cv2.minEnclosingCircle(cnts[0])
print('圆心和半径:({},{})'.format(center, radius))
center = (int(center[0]), int(center[1]))
radius = int(radius)
img_close = cv2.circle(close, center, radius, (255, 255, 255), 30)
axes[1][2].imshow(img_close, cmap=plt.get_cmap('gray'))
img_close2 = cv2.circle(gray, center, radius, (255, 255, 255), 30)
axes[1][3].imshow(img_close2, cmap=plt.get_cmap('gray'))
plt.show()