阴影检测(shadow detect)

不管是无人机影像或者其它方式摄取的图像,由于光照,难免会存在阴影,笔者这篇文章介绍检测阴影一种简单的方式。

参考论文:

1、Damaged Building Detection in Aerial Images using Shadow Information

2、Linearized Vegetation Indices Based on aFormal Statistical Framework

主要原理:(以NDVI算法举一反三,ndvi(归一化植被指数)

NDVI=nir-red/(nir+red)

第一步:读入图像,通道分离,并对各通道中值滤波,滤波核大小可以不一样,自行调试。

第一步:计算如下值,注意的时,计算的时候一定要数据类型转换,将bguint8 格式转为double 或者float ,否则计算的结果有问题!!!!!!

第二步:构造mask, 上式大于某一阈值的为1,反之为0,笔者这幅Image 用的0.2

第三步:本来用matlabbwareopen 这个函数,这个函数是移除指定面积大小小于某一个阈值的像素,因为在opencv中没有这个函数,要不然自己写,要不然继续去挖掘python 其它图像处理包,本人是懒人,所以在skimage 找的函数:

remove_small_objects。自己写的话,步骤如下:

1、二值化图像,找轮廓

2、筛选轮廓,轮廓面积小于某个阈值的,保存

3、将满足2的轮廓中像素值全部赋值0

第四步:膨胀运算,掩模膨胀 - 掩模 = 阴影轮廓。
code:


# -*- coding: utf-8 -*-
import numpy as np
import cv2
from skimage.morphology import remove_small_objects
im1=cv2.imread(r'C:\Users\Y\Desktop\im1.jpg')
b,g,r=np.double(cv2.split(im1))
shadow_ratio = (4/np.pi)*np.arctan2((b-g),(b+g)) #mutiply 4/pi is to ensure value[0,1]
shadow_mask=shadow_ratio>0.2
#cv2.imshow("shadow_mask",np.uint8(shadow_mask*255))
shadow_mask[:5,:]=0
shadow_mask[-5:,:]=0
shadow_mask[:,:5]=0
shadow_mask[:,-5:]=0#边界上的值=0
#cv2.imshow("shadow_mask1",np.uint8(shadow_mask*255))
shadow_mask=remove_small_objects(shadow_mask, min_size=100, connectivity=3)
# opencv 中没有matlab 中类似bwareaopen的函数,二值图像面积开运算
cv2.imshow("shadow_mask1",np.uint8(shadow_mask*255))
kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
kernel[1,0]=0
kernel[3,0]=0
kernel[1,4]=0
kernel[3,4]=0
shadow_mask1=np.uint8(shadow_mask*1)
mask=cv2.dilate(shadow_mask1,kernel)-shadow_mask1
#cv2.imshow("boundary",np.uint8(mask*255))
#substarct shadow_mask is to get boundary
#get boundary
[row,col]=np.where(mask==1)
#for i in range(len(row)-1):
#    cv2.line(im1,(col[i],row[i]),(col[i+1],row[i+1]),(0,0,255),1)
im1[row,col,:]=im1[40,40,:]
cv2.imshow("original-shadow",im1)
cv2.waitKey(0)

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 您好,使用yolov5进行批量检测图片的方法如下: 1. 准备待检测的图片,将它们放在同一个文件夹中。 2. 在终端中进入yolov5代码所在的文件夹。 3. 运行以下命令: python detect.py --weights yolov5s.pt --img 640 --conf .4 --source /path/to/folder/with/images 其中,--weights指定模型权重文件的路径,--img指定输入图片的大小,--conf指定置信度阈值,--source指定待检测图片所在的文件夹路径。 4. 等待程序运行完成,检测结果会保存在同一文件夹中,以检测图片的文件名为前缀。 希望对您有所帮助。 ### 回答2: YOLOv5是目前在计算机视觉人工智能领域中较热门的算法之一。它是基于深度学习技术的目标检测算法,并且在检测速度和准确率方面表现优异。其基于PyTorch框架的实现使得其具备较好的可用性和易于扩展。在实际应用中,我们常常需要对大量图像进行批量检测,这时候,就可以使用YOLOv5批量检测图片。 首先,我们需要准备好一批需要检测的图片,并将这些图片保存在一个文件夹中。接着,我们需要使用YOLOv5的命令行工具yolov5/detect.py进行批量检测。运行该命令行工具需要指定的参数包括: 1. --source:要检测的图片所在文件夹的路径; 2. --weights:预训练的模型权重文件路径; 3. --conf:置信度阈值,过滤掉检测框置信度低于该阈值的结果; 4. --iou:IoU阈值,过滤掉重复检测框的结果; 5. --output:检测结果保存路径。 例如,我们可以使用以下命令行指令,在指定文件夹中批量检测图片: ``` python detect.py --source /path/to/images --weights yolov5s.pt --conf 0.5 --iou 0.5 --output /path/to/output ``` 运行以上指令后,YOLOv5就会自动批量检测图片,并且将检测结果保存在指定的输出路径下。 此外,YOLOv5还提供了许多其他的参数,例如可以指定使用CPU还是GPU进行计算。如果要将检测结果可视化,可以将"--view-img"参数设置为True。 总之,YOLOv5是一款十分灵活、强大且易于使用的目标检测算法,在许多场景中都可以发挥重要的作用。对于需要批量检测图片的应用,我们可以使用其提供的命令行工具轻松实现批量检测任务。 ### 回答3: YOLOv5是一种目标检测算法,可用于检测图像或视频中的目标对象。在实际应用场景中,用户通常需要批量处理一组图像,进行目标对象的检测和分析。在这种情况下,YOLOv5的批量检测功能就非常有用了。 批量检测图像采用了自动化处理的方式,即通过编写脚本程序自动读取多张图片,并将检测结果输出到指定的文件夹中。YOLOv5批量检测图片需要采用以下步骤: 步骤1:下载YOLOv5 在进行批量检测之前,需要先下载并安装YOLOv5。可以从Github上获取YOLOv5的所有源代码和文件,并按照指示进行安装。 步骤2:选择测试图片 选择需要进行批量检测的图片集合。这些图片必须放在同一个文件夹中,方便程序自动读取。 步骤3:编写脚本程序 编写 Python 脚本程序,实现读取图片并进行目标检测。这个脚本程序包含以下几个部分: 一、读入模型,加载模型权重。 二、设置设备,可以使用 GPU 或 CPU 进行检测。 三、设置图片路径,通过循环遍历指定文件夹中的所有图片: 1.使用cv2读取图像; 2.对图像进行预处理,如归一化、缩放、转换颜色空间等操作。 3.将处理后的图像传递给模型进行目标检测,返回目标框信息。 四、根据目标框信息在原图上画出框和标签,输出到指定文件夹中。 步骤4:运行程序 将编写好的脚本程序保存到指定文件夹,打开命令提示符窗口,在程序所在目录下执行python命令运行程序。程序运行时间根据所检测的图片数量和复杂度而异。 步骤5:检查结果 程序运行结束后,根据自动指定的输出文件夹查看检测结果,可以使用cv2.imshow()或matplotlib将结果显示在屏幕上,或是将结果保存到指定文件夹。可以通过这些方法来检查所输出的结果的准确性和完整性。 总而言之,YOLOv5批量检测图片的程序编写和执行需要一定的程序设计和编程知识,同时也需要对目标检测方法和算法有一定的了解。对于没有编程经验和专业知识的用户,可以在网络上寻找已有的程序代码或相关教程,以便更好地进行批量检测图片。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值