opencv凸包、近似、物体骨架

该代码示例展示了如何使用Python的OpenCV、numpy和scikit-image库对图像进行处理,包括将图像转换为YUV空间,二值化,去除小物体,找到轮廓,计算并绘制凸包和近似轮廓,以及生成骨架图像。处理后的图像分别保存为不同类型的文件。
摘要由CSDN通过智能技术生成

代码:

import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
from skimage import morphology
import copy
image_path = r"E:\n1\two"
save = r"E:\n1\save2"
path_list = os.listdir(image_path)
# print(path_list)
times = 1
def changezero2255(img,img1):
    er = img.astype("int")
    er[er == 1] = 255
    er[er == 0] = 0
    image = np.zeros_like(img1)
    image[:, :, 0] = er
    image[:, :, 1] = er
    image[:, :, 2] = er

    return image

for i in path_list:
    print(i)

    img1 = cv2.imread(image_path + "/"+i)
    yuv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2YUV)
    v1 = yuv1[:, :, 2]
    v1_binary = ~np.logical_not(v1 > 127)
    yuv_img_one = morphology.remove_small_objects(v1_binary, min_size=500, connectivity=1)
    one_img = yuv_img_one.astype('uint8')
    contours, _ = cv2.findContours(one_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    print(times, "个数:", len(contours))
    for con in contours:
        area = -cv2.contourArea(con, True)
        # 将面积小于2000的小点点用黑色覆盖
        if area < 2000:
            x, y, w, h = cv2.boundingRect(con)
            cv2.rectangle(one_img, (x, y), (x + w, y + h), (0, 0, 0), -1)
        # print(times, i, area)
    # 去除面积较小的白点后的三通道图
    image1 = changezero2255(one_img,img1)
    # 凸包图
    image2 = copy.deepcopy(image1)
    contours_tubao, _ = cv2.findContours(one_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    for cnt in contours_tubao:
        tubao = cv2.convexHull(cnt)
        cv2.polylines(image2, [tubao], True, (255, 0, 255), 10)
        print("凸包:",tubao[0])

    # 近似轮廓图
    image3 = copy.deepcopy(image1)
    contours_jinsi, _ = cv2.findContours(one_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    for cnt in contours_jinsi:
        jinsi = cv2.approxPolyDP(cnt, 3, True)
        cv2.polylines(image3, [jinsi ], True, (255, 255, 0), 3)
        print("近似:", jinsi[0])

    # 烟丝骨架图
    gujiaimage = copy.deepcopy(one_img)
    gujia = morphology.skeletonize(gujiaimage)
    image4 = changezero2255(gujia,img1)

    save_p1 = save + "\\" +"yuantu" + i
    cv2.imwrite(save_p1, image1)
    save_p2 = save + "\\" + "tubao" + i
    cv2.imwrite(save_p2, image2)
    save_p3 = save + "\\" + "jinsi" + i
    cv2.imwrite(save_p3, image3)
    save_p4 = save + "\\" + "gujia" + i
    cv2.imwrite(save_p4, image4)

    plt.imshow(image2)
    plt.title(f"times: {times} tubao: {i}")
    plt.show()

    times += 1

原图:

在这里插入图片描述

处理后:

骨架:

在这里插入图片描述

近似:

在这里插入图片描述

凸包:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值