两种尺度的图像滑窗效果

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)

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



http://www.chinasem.cn/article/422470

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

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总