【最强技巧】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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值