两种尺度的图像滑窗效果

2023-11-24 19:59

本文主要是介绍两种尺度的图像滑窗效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、简单示例

当给你一张随机大小的图片时,用固定的矩形框框住目标,有些目标可能很大,有些目标也可能很小,比如从下面的目标找出猫眼,如果采用固定大小的矩形框,会出现漏检的情况:
这里写图片描述
这里的固定框、固定大小图片代码为:

'''
Created on 2017年8月19日@author: XuTing
'''
# import the necessary packages
import helpers
import time
import cv2# load the image and define the window width and height
image = cv2.imread('../image/cat2.jpg')  
(winW, winH) = (200, 128)
i = 0# loop over the image pyramid
for resized in helpers.pyramid(image, scale=1.5,minSize=(winW, winH)):# loop over the sliding window for each layer of the pyramidfor (x, y, window) in helpers.sliding_window(resized, stepSize=32, windowSize=(winW, winH)):# if the window does not meet our desired window size, ignore itif window.shape[0] != winH or window.shape[1] != winW:continue# THIS IS WHERE YOU WOULD PROCESS YOUR WINDOW, SUCH AS APPLYING A# MACHINE LEARNING CLASSIFIER TO CLASSIFY THE CONTENTS OF THE# WINDOW# since we do not have a classifier, we'll just draw the windowclone = resized.copy()cropImg_clone = resized.copy()cv2.rectangle(clone, (x, y), (x + winW, y + winH), (0, 255, 0), 2)cropImg = cropImg_clone[y: (y + winH),x:(x + winW)]#H,Wcv2.imshow("Window", clone)cv2.imshow("cropImg", cropImg)cv2.waitKey(1)#write
#         WinName = "Layer {}".format(i + 1)
#         cv2.imwrite('./'+WinName+'.jpg',clone)
#         i += 1time.sleep(0.025)

helpers:

'''
Created on 2017年8月19日@author: XuTing
'''
# import the necessary packages
import imutils
from skimage.transform import pyramid_gaussian
import cv2def pyramid(image, scale=1.5, minSize=(30, 30)):# yield the original imageprint('(H:{},W:{})'.format(image.shape[0], image.shape[1]))
#     yield image# compute the new dimensions of the image and resize itw = int(image.shape[1] / scale)image = imutils.resize(image, width=w)print('resize=(H:{},W:{})'.format(image.shape[0], image.shape[1]))# if the resized image does not meet the supplied minimum# size, then stop constructing the pyramidif image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:print("Out of size!")else:yield imagedef pyramid2(image, scale=1.5, minSize=(30, 30)):# yield the original imageyield image# keep looping over the pyramidwhile True:# compute the new dimensions of the image and resize itw = int(image.shape[1] / scale)image = imutils.resize(image, width=w)print('(H:{},W:{})'.format(image.shape[0], image.shape[1]))# if the resized image does not meet the supplied minimum# size, then stop constructing the pyramidif image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:print("Out of size!")break# yield the next image in the pyramidyield image        
def sliding_window(image, stepSize, windowSize):# slide a window across the imagefor y in range(0, image.shape[0], stepSize):for x in range(0, image.shape[1], stepSize):# yield the current windowyield (x, y, image[y:y + windowSize[1], x:x + windowSize[0]])if __name__ == '__main__':image = cv2.imread('../image/cat2.jpg')  # METHOD #2: Resizing + Gaussian smoothing.for (i, resized) in enumerate(pyramid_gaussian(image, downscale=2)):# if the image is too small, break from the loopif resized.shape[0] < 30 or resized.shape[1] < 30:break# show the resized imageWinName = "Layer {}".format(i + 1)cv2.imshow(WinName, resized)cv2.waitKey(0)resized = resized*255cv2.imwrite('./'+WinName+'.jpg',resized)

为此采用了两种策略:
1)基于多尺度图片的定位;
固定的滑动窗口大小,而图像的尺寸按照一定比例缩放,而不是压缩,类似于金字塔的形状。
2)基于多尺寸滑动窗口的定位;
固定的图片大小,而滑动窗口尺寸会按照一定比例缩小,当小于设定的最小尺寸时,程序结束。

2、基于多尺度图片的定位

参考多尺度图片滑动窗口输出 - Alex_XT的博客 - CSDN博客
http://blog.csdn.net/u011463646/article/details/77417049
其实现的效果为:
这里写图片描述
代码:

'''
Created on 2017年11月20日@author: XuTing
'''
# import the necessary packages
import helpers
import argparse
import time
import cv2
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
IMAGE_PATH=os.path.join(BASE_DIR,'image','cat.jpg')
print(IMAGE_PATH)
# load the image and define the window width and height
image = cv2.imread(IMAGE_PATH)  
(winW, winH) = (100, 64)
i = 0# loop over the image pyramid
for resized in helpers.pyramid2(image, scale=2):# loop over the sliding window for each layer of the pyramidfor (x, y, window) in helpers.sliding_window(resized, stepSize=32, windowSize=(winW, winH)):# if the window does not meet our desired window size, ignore itif window.shape[0] != winH or window.shape[1] != winW:continue# THIS IS WHERE YOU WOULD PROCESS YOUR WINDOW, SUCH AS APPLYING A# MACHINE LEARNING CLASSIFIER TO CLASSIFY THE CONTENTS OF THE# WINDOW# since we do not have a classifier, we'll just draw the windowclone = resized.copy()cv2.rectangle(clone, (x, y), (x + winW, y + winH), (0, 255, 0), 2)cv2.imshow("Window", clone)cv2.waitKey(100)#write
#         WinName = "Layer {}".format(i + 1)
#         cv2.imwrite('./'+WinName+'.jpg',clone)
#         i += 1
#         time.sleep(0.025)

3、基于多尺寸滑动窗口的定位

在固定的图片大小中,使用不同大小的滑动窗口来实现目标的定位与检验:
(H:768,W:1024)
resize=(H:511,W:682)
minSize=windowList[-1]= (25, 16)
(winW, winH)=(200,128)
(winW, winH)=(100,64)
(winW, winH)=(50,32)
(winW, winH)=(25,16)
这里写图片描述

代码下载:http://download.csdn.net/download/u011463646/10126421

'''
Created on 2017年11月20日@author: XuTing
'''
# import the necessary packages
import helpers
import time
import cv2# load the image and define the window width and height
image = cv2.imread('../image/cat2.jpg')  
windowList = [(200, 128),(100,64),(50,32),(25,16)]# 使用了元组
i = 0# loop over the image pyramid
for resized in helpers.pyramid(image, scale=1.5,minSize=windowList[-1]):print("minSize=windowList[-1]=",windowList[-1])# loop over the sliding window for each layer of the pyramidfor winSize in windowList:winW=winSize[0]winH=winSize[1]print("(winW, winH)=({},{})".format(winW,winH))for (x, y, window) in helpers.sliding_window(resized, stepSize=32, windowSize=(winW, winH)):# if the window does not meet our desired window size, ignore itif window.shape[0] != winH or window.shape[1] != winW:continue# THIS IS WHERE YOU WOULD PROCESS YOUR WINDOW, SUCH AS APPLYING A# MACHINE LEARNING CLASSIFIER TO CLASSIFY THE CONTENTS OF THE# WINDOW# since we do not have a classifier, we'll just draw the windowclone = resized.copy()cropImg_clone = resized.copy()cv2.rectangle(clone, (x, y), (x + winW, y + winH), (0, 255, 0), 2)cropImg = cropImg_clone[y: (y + winH),x:(x + winW)]#H,Wcv2.imshow("Window", clone)cv2.imshow("cropImg", cropImg)cv2.waitKey(1)#write#WinName = "Layer {}".format(i + 1)#cv2.imwrite('./'+WinName+'.jpg',clone)#i += 1time.sleep(0.025)

这篇关于两种尺度的图像滑窗效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/u011463646/article/details/78587595
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/422470

相关文章

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell