【最强技巧】Jupyter Notebook + OpenCV 完美组合
加入QQ交流群 302493982 获取完整代码,谢谢支持!!
导入常用的包
#基本导入
import cv2
import matplotlib.pyplot as plt
import math
import numpy as np
%matplotlib inline
显示图片
避免每次都书写3句,直接一个show就搞定
def show(img):
cv2.imshow('name', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在Jupyter Notebook内阵列显示图片
def show_all(*arg):
index = 1
myLen = len(arg)
row = math.ceil(math.sqrt(myLen))
myCol = myLen // row
for i in range(myCol + 1):
for j in range(row):
#print(myCol + 1, row)
if i * row + j < myLen :
if len(arg[i * row + j].shape) == 3:
b,g,r = cv2.split(arg[i * row + j])
t_img = cv2.merge([r,g,b])
else:
t_img = arg[i * row + j]
plt.subplot(myCol + 1, row, i * row + j + 1)
plt.imshow(t_img.astype('uint8'))
plt.title(index)
index += 1
plt.xticks([]), plt.yticks([])
else:
plt.show()
return
可以无限传入图片,自动布局
使用矩形框中图片中的物体
row_img:原始图片
my_min:最小框的大小(因为可能会框到好多好多,所以要筛选一下)
my_max:最大框的大小(因为可能会框到好多好多,所以要筛选一下)
bitwise = False:是否翻转颜色,默认是不翻转
def kuang(row_img, my_min, my_max, bitwise = False):
img = row_img.copy()
if bitwise:
cv2.bitwise_not(img, img)
if len(img.shape) == 3:
img = cv2.cvtColor(img.copy(), cv2.COLOR_RGB2GRAY)
res1 = t = img.copy()
t.fill(255)
res2 = img.copy()
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for i in contours :
if cv2.contourArea(i) > my_min and cv2.contourArea(i) < my_max:
res1 = cv2.drawContours(t, i, -1, (0), 1)
rect = cv2.minAreaRect(i)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(t, [box], 0, (0), 2)
cv2.drawContours(res1, [box], 0, (0), 2)
cv2.drawContours(res2, [box], 0, (0), 2)
show_all(res1, res2)
return [res1, res2]
使用更多的测试来对图片进一步了解
def test_all(img) :
res, dst1 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_BINARY) #1
res, dst2 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_BINARY_INV) #2
res, dst3 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TRUNC) #3
res, dst4 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TOZERO) #4
res, dst5 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TOZERO_INV) #5
res, dst6 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_MASK) #6
res, dst7 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_OTSU) #7
res, dst8 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TRIANGLE) #8
res, dst11 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_BINARY) #9
res, dst22 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_BINARY_INV) #10
res, dst33 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TRUNC) #11
res, dst44 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TOZERO) #12
res, dst55 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TOZERO_INV) #13
res, dst66 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_MASK) #14
res, dst77 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_OTSU) #15
res, dst88 = cv2.threshold(img.copy(), 127, 255, cv2.THRESH_TRIANGLE) #16
blur = cv2.blur(img.copy(), (13, 13)) #17
kernel = np.ones((5, 5), np.uint8)
erosion1 = cv2.erode(img.copy(), kernel, iterations = 1) #18
erosion2 = cv2.dilate(img.copy(), kernel, iterations = 1) #19
erode = cv2.erode(img.copy(), kernel, iterations = 2) #腐蚀
dilate2 = cv2.dilate(erode, kernel, iterations = 2) #膨胀 #20
morphologyEx1 = cv2.morphologyEx(img.copy(), cv2.MORPH_OPEN, kernel) #先腐蚀后膨胀 #21
morphologyEx2 = cv2.morphologyEx(img.copy(), cv2.MORPH_CLOSE, kernel) #先膨胀后腐蚀 #22
morphologyEx3 = cv2.morphologyEx(img.copy(), cv2.MORPH_GRADIENT, kernel) #膨胀的减去腐蚀的,就剩边缘 #23
morphologyEx4 = cv2.morphologyEx(img.copy(), cv2.MORPH_TOPHAT, kernel) #礼帽,原始操作-开运算,只剩下毛刺了 #24
morphologyEx5 = cv2.morphologyEx(img.copy(), cv2.MORPH_BLACKHAT, kernel) #25
#show(dst1);show(dst2);show(dst3);show(dst4);show(dst5);show(dst6);show(dst7);show(dst8);show(dst11);show(dst22);show(dst33);
#show(dst44);show(dst55);show(dst66);show(dst77);show(dst88);show(blur);show(erosion1);show(erosion2);show(morphologyEx1);
#show(morphologyEx2);show(morphologyEx3);show(morphologyEx4);show(morphologyEx5);
show_all(dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst8, dst11, dst22, dst33, dst44, dst55, dst66, dst77, dst88,
blur, erosion1, erosion2, dilate2, morphologyEx1, morphologyEx2, morphologyEx3, morphologyEx4, morphologyEx5)
快速保存图片
def save(img, name = 'temp.jpg'):
if len(name) < 4 or name[-4:] != '.jpg':
name += '.jpg'
print(cv2.imwrite(name, img))
直接save(img)就可以保存,默认名字为temp.jpg