语义分割结果可视化(画目标轮廓线与最小包围框)_人工智睿的博客-程序员信息网_语义分割结果

技术标签: 配置  计算机视觉  Python小记  深度学习  opencv  

效果如图:
在这里插入图片描述

#文件夹预测
import math
from unet import Unet
from PIL import Image
import numpy
import os
import os.path
import numpy as np
import cv2

unet = Unet()
# 指明被遍历的文件夹
maindir = r'G:\\DL\\unet-keras\\unet-keras-master\\stone_predict\\ture\\stone'
blenddir= r'G:\\DL\\unet-keras\\unet-keras-master\\stone_predict\\ture\\add1207'


def drawDetect(img,predict_image,image_bgr):
    shape = predict_image.shape
    w = shape[1]
    h = shape[0]
    threshold=h/30 * w/30
    blurred = cv2.GaussianBlur(img, (11, 11), 0)
    edged = cv2.Canny(blurred, 30, 150)  # 用Canny算子提取边缘
    contours, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 寻找封闭区域
    maxCnt=-1
    if contours is not None:
        for i in range(len(contours)):
            area = cv2.contourArea(contours[i])  # 计算轮廓所占面积
            if area > threshold:  # 将area小于阈值区域填充背景色,由于OpenCV读出的是BGR值

                # cv2.drawContours(img, [contours[i]], -1, (84, 1, 68), thickness=-1)  # 原始图片背景BGR值(84,1,68)
                rect = cv2.minAreaRect(contours[i])  # 最小外接矩形
                rect_w, rect_h = (rect[1][0]) + 1.0, (rect[1][1]) + 1.0  # 最小外接矩形的宽和高
                if rect_w > rect_h:
                    angle = 90 - rect[2]
                    L = rect_w
                    Ly = rect_w * math.cos(math.radians(angle))
                    Lx = rect_w * math.sin(math.radians(angle))
                else:
                    angle = rect[2]
                    L = rect_h
                    Ly = rect_h * math.cos(math.radians(angle))
                    Lx = rect_h * math.sin(math.radians(angle))
                box = np.int0(cv2.boxPoints(rect))  # 矩形的四个角点取整
                if box is not None:
                    image_bgr = cv2.drawContours(image_bgr, [box], 0, (0, 0, 255), 2)
                image_bgr = cv2.drawContours(image_bgr, contours[i], -1, (0, 255, 0), 3)
                continue
        # predict_image = cv2.drawContours(image_bgr, contours, -1, (0, 255, 0), 3)

        # return contours, box
        return image_bgr


# while True:
for parent, dirnames, filenames in os.walk(maindir):  # 遍历每一张图片
    for filename in filenames:
        pic_name = os.path.join(parent, filename)
        image = Image.open(pic_name)
        r_image = unet.detect_image(image)
        # predict_image = cv2.imread(r_image)
        image_bgr = cv2.cvtColor(numpy.asarray(image), cv2.COLOR_RGB2BGR)  # PIL转为cv.bgr
        predict_image = cv2.cvtColor(numpy.asarray(r_image), cv2.COLOR_RGB2BGR)  # PIL转为cv.bgr
        predict_gray = cv2.cvtColor(predict_image, cv2.COLOR_BGR2GRAY)  # 转为灰度图
        # contours, box = drawDetect(predict_gray,predict_image)
        predict_image2 = drawDetect(predict_gray,predict_image,image_bgr)
        if predict_image2 is None:
            predict_image2 = image_bgr
        # print(type(predict_image2))
        blend_image = Image.fromarray(cv2.cvtColor(predict_image2,cv2.COLOR_BGR2RGB))
        blend_image.save(blenddir +'\\' +  pic_name.split('.')[0].strip(parent) + ".png")  # 存储裁剪得到的图像,需要先创建文件夹

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44671418/article/details/121779312

智能推荐

前端小总结之简单的图文混排_YanTuTwo的博客-程序员信息网

p img.one{ float:left; } p img.two{ float:right; } 那一瞬间,你终于发现,那曾深爱过的人,早在告别的那天,已消失在这个世界。心中的爱和思念,都只是属于自己曾经拥有过的纪念。我想,有些事情是可以遗忘的,有些事情是可以记念的,有些事情能够心甘情愿,有些事情一直无能为力。我爱你,这是我的

[Boot]Kernel启动_Letcos的博客-程序员信息网_boot kernel

platform:RK3399OS:Android 7.1Kernel:4.4参考:1.Younix 《Android启动流程分析》概述Uboot最后阶段通过do_bootm_linux跳转到内核,此时内核开始运行,uboot任务完成。之后内核会完成一系列的初始化和注册,最终启动init进程(pid=1)和kthreadd(pid=2),并进入idle.整体介绍start_k...

electron打包项目成exe桌面应用_少年是只猫的博客-程序员信息网_electron exe

electron打包成exe桌面应用使用electron可将网页打包成桌面应用,自带浏览器,所以打包后的exe会多出浏览器的大小(40-100M)。打包环境:需安装node.js。建立electron项目1. 安装electronnpm install --save-dev electron2. 简易项目直接在electron官网上给的链接下载简易demo或者复制main.js和i...

Kotlin:深入理解StateFlow与SharedFlow,StateFlow和LiveData使用差异区分,SharedFlow实现源码解析。_pumpkin的玄学的博客-程序员信息网

本文接上一篇博文:Kotlin:Flow 全面详细指南,附带源码解析。文章目录StateFlow、SharedFlowStateFlow使用StateFlow简介StateFlow的用法LiveData与StateFlow差异对比StateFlow特别说明Android中使用StateFlow实践SharedFlow使用SharedFlow简介SharedFlow的使用SharedFlow使用实战????‍♀️SharedFlow、StateFlow的使用区别,换句话说,事件和状态的区别?StateFlo

从类文件分析Java类装载过程<clinit>方法的调用和<init>的调用_tiancai_lanyangyang的博客-程序员信息网

类的具体加载过程,再到初始化;从类文件字节码分析,类装载调用<clinit>,到类员初始化调用<init>,从init中可以看出构造方法总是在最后才调用的

随便推点

计算机组成:真正理解SDR、DDR以及相关计算_Zeal Young的博客-程序员信息网_sdr与ddr

SDRAM的相关计算以及理解SDR和DDR:关于SDR、DDR的理解首先,SDR的全称是SDR SDRAM,但是两个SDR的意思是完全不同的!SDRAM:Syncronous Dynamic Random Access Memory,对应中文:同步动态随机存取存储器。 SDR:Single Data Rate,单数据率。 DDR: Double Data Rate,双数据率。了解...

django中配置和使用redis缓存_天黑前最后的余辉的博客-程序员信息网

一、自定义连接池这种方式跟普通py文件操作redis一样,代码如下:views.pyimport redisfrom django.shortcuts import render,HttpResponsefrom utils.redis_pool import POOLdef index(request): conn = redis.Redis(connection_...

你想看的集成学习之bagging和boosting区别特征及例子_blank_tju的博客-程序员信息网

这篇文章主要讲述集成学习的bagging和boosting。首先bagging和boosting是集成学习的两个大家族,每个家族也包括很多成员,例如boosting包括adaboost、xgboost,bagging也有RandomForest等方法。既然bagging和boosting是这些算法的基础,那他们的思想是什么呢?Bagging和Boosting的理解与思想简单总结Ba...

程序员如何正确应对压力_DU_YULIN的博客-程序员信息网

节选自《代码整洁之道-程序员的职业素养》:应对压力的诀窍在于,能回避压力时尽可能地回避,当无法回避时则勇敢直面压力。可以通过慎重承诺、遵循自己的纪律规则、保持整洁等来回避压力。直面压力时,则要保持冷静,与别人多多沟通,尤其是你的领导,坚守自己的原则纪律,并寻求他人的帮助。...

Jzoj P4779 鞍点___组合数+容斥+dp_disPlayLzy_的博客-程序员信息网

题目大意:1≤n,m≤2000,1≤k≤10,1≤l≤1e91≤n,m≤2000,1≤k≤10,1≤l≤1e91≤n,m≤2000,1≤k≤10,1≤l≤1e9分析:令dpi,jdp_{i,j}dpi,j​表示矩阵中至少存在jjj个鞍点,且这些点的数值≤iii时矩阵的方案数。考虑如何转移:假设我们当前的dpi,jdp_{i,j}dpi,j​而言,我再加入rrr个数值为i+1i+1i+1...

SQLite命令基础详解_孜然香菜的博客-程序员信息网_sqlite基本命令

SQLite命令基础详解1、首先确保模拟器已经打开2、打开cmd,输入adb shell如果显示的是$符号,则表示你是普通用户,输入su获得超级用户权限 3、可以使用ls命令查看当前位置的所有文件4、使用cd命令进入data/data文件夹,所有应用程序的本地存储文件都是在这个文件夹下的。5、com.android.providers.contacts中存储的是联系人相关数据databases文件夹是用来存放数据库文件的;files是用来存放普通文本的shared_prefs

推荐文章

热门文章

相关标签