python图片顶端_python 图片滑动窗口

本文介绍使用Python和OpenCV构建图像金字塔,并结合滑动窗口进行图像处理。主要内容包括无平滑缩放和高斯平滑缩放两种方法,以及如何应用滑动窗口在不同缩放层上检测和定位图像中的特定区域,如车牌文字。
摘要由CSDN通过智能技术生成

METHOD #1: No smooth, just scaling.

def pyramid(image, scale=1.5, minSize=(30, 30)):

# yield the original image

yield image

# keep looping over the pyramid

while True:

# compute the new dimensions of the image and resize it

w = int(image.shape[1] / scale)

image = imutils.resize(image, width=w)

# if the resized image does not meet the supplied minimum

# size, then stop constructing the pyramid

if image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:

break

# yield the next image in the pyramid

yield image

METHOD #2: Resizing + Gaussian smoothing.

# import the necessary packages

import helpers

from skimage.transform import pyramid_gaussian

import argparse

import cv2

# construct the argument parser and parse the arguments

ap = argparse.ArgumentParser()

ap.add_argument("-i", '--image', required=True, help="Path to the image")

ap.add_argument("-s", "--scale", type=float, default=1.5, help="scale factor size")

args = vars(ap.parse_args())

# load the image

image = cv2.imread(args["image"])

# METHOD #1: No smooth, just scaling.

# loop over the image pyramid

for (i, resized) in enumerate(helpers.pyramid(image, scale=args["scale"])):

# show the resized image

cv2.imshow("Layer {}".format(i + 1), resized)

cv2.waitKey(0)

# close all windows

cv2.destroyAllWindows()

# METHOD #2: Resizing + Gaussian smoothing.

for (i, resized) in enumerate(pyramid_gaussian(image, downscale=2)):

# if the image is too small, break from the loop

if resized.shape[0] < 30 or resized.shape[1] < 30:

break

# show the resized image

cv2.imshow("Layer {}".format(i + 1), resized)

cv2.waitKey(0)

#Run cmd python pyramid.py --image image/cat.jpg --scale 1.5

参考

【1】Image Pyramids with python and OpenCV - PyImageSearch

http://www.pyimagesearch.com/2015/03/16/image-pyramids-with-python-and-opencv/

【2】jrosebr1/imutils: A series of convenience functions to make basic

image processing operations such as translation, rotation, resizing,

skeletonization, and displaying Matplotlib images easier with opencv and

Python.

https://github.com/jrosebr1/imutils

【3】Histogram of Oriented Gradients and Object Detection - PyImageSearch

http://www.pyimagesearch.com/2014/11/10/histogram-oriented-gradients-object-detection/

【4】Module: transform — skimage v0.14dev docs

http://scikit-image.org/docs/dev/api/skimage.transform.html#pyramid-gaussian

上边我们介绍了图片不压缩的情况下,重新resize到不同大小,这样做的目的是为这一节做准备,即利用滑动窗口圈住图片的文字信息内容等,例如车牌的获取。

# import the necessary packages

import helpers

import argparse

import time

import cv2

# load the image and define the window width and height

image = cv2.imread('./image/cat.jpg')

(winW, winH) = (200, 128)

# loop over the image pyramid

for resized in helpers.pyramid(image, scale=1.5):

# loop over the sliding window for each layer of the pyramid

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 it

if 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 window

clone = resized.copy()

cv2.rectangle(clone, (x, y), (x + winW, y + winH), (0, 255, 0), 2)

cv2.imshow("Window", clone)

cv2.waitKey(1)

# time.sleep(0.025)

helpers:

'''

Created on 2017年8月19日

@author: XuTing

'''

# import the necessary packages

import imutils

from skimage.transform import pyramid_gaussian

import cv2

def pyramid(image, scale=1.5, minSize=(30, 30)):

# yield the original image

yield image

# keep looping over the pyramid

while True:

# compute the new dimensions of the image and resize it

w = int(image.shape[1] / scale)

image = imutils.resize(image, width=w)

# if the resized image does not meet the supplied minimum

# size, then stop constructing the pyramid

if image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:

break

# yield the next image in the pyramid

yield image

def sliding_window(image, stepSize, windowSize):

# slide a window across the image

for y in range(0, image.shape[0], stepSize):

for x in range(0, image.shape[1], stepSize):

# yield the current window

yield (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 loop

if resized.shape[0] < 30 or resized.shape[1] < 30:

break

# show the resized image

WinName = "Layer {}".format(i + 1)

cv2.imshow(WinName, resized)

cv2.waitKey(10)

resized = resized*255

cv2.imwrite('./'+WinName+'.jpg',resized)

效果

efe1a28cab599f47e937ef83d971d8f2.png

4d860edba91c7651c9134451b3e4fa23.png

eb0d9f4927e00853fc17e878310649aa.png

7732c999d4753f8b66a9538e9efe88ce.png

f62722817945344eeee01f302d76ee82.png

b1bccf0116a94f9fc49b94ecce59c579.png

865629570a9e65b3db9879081f456539.png

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值