个人技术分享

需求:
一张图片中有多个目标物体,将多个目标物体进行识别分割定位

import cv2
import numpy as np


def show_photo(name,picture):
    cv2.imshow(name,picture)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    
img_path = r"test3.png"
img = cv2.imread(img_path)
show_photo("img",img)

height, width = img.shape[:2]  # 得到行和列的长度

image = cv2.imread(img_path)
shape = image.shape
image_row = shape[0]
image_col = shape[1]
print(image_row,image_col)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 得到灰度图
#show_photo("gray",gray)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
show_photo("binary",binary) # 二值化

kernel = np.ones((3, 3), np.uint8)
img_dilate = cv2.dilate(binary, kernel, iterations = 5) # 膨胀
show_photo("img_dilate",img_dilate)

outImage, contours, hireachy = cv2.findContours(img_dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找轮廓

draw_img = image.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2) # 绘制轮廓,一定要copy要不然会覆盖原图
show_photo('res',res)

draw_img1 = image.copy()
for cont in contours: # 绘制轮廓到原图上
    x, y, w, h = cv2.boundingRect(cont)
    cv2.rectangle(draw_img1, (x, y), (x+w, y+h), (255, 0, 0), 1,8)
    print((x, y),(x+w, y+h))
    show_photo('img_part',image[y:y+h,x:x+w]) # 截取每个物体所对应的ROI
show_photo('draw_img1',draw_img1)

运行效果:
原图
在这里插入图片描述
二值图
在这里插入图片描述
膨胀
在这里插入图片描述
canny找轮廓
在这里插入图片描述
挨个分割
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
分割整体
在这里插入图片描述