使用Python和OpenCV构建图像金字塔
使用Python和OpenCV的圖像金字塔
- 1. 效果圖
- 2. 什么是圖像金字塔?
- 3. 依賴
- 4. 源碼
- 參考
這篇博客將介紹如何使用兩種方法構造圖像金字塔。
-
使用Python和OpenCV構建金字塔,此方法不會在金字塔的每一層使用高斯平滑圖像,因此更適合與HOG描述符一起使用。
-
使用Python + scikit-image構建金字塔,在金字塔的每一層都應用高斯平滑。
應該使用哪種方法?——取決于應用程序。如果將HOG描述符用于對象分類,則使用第一種方法,因為平滑會損害分類性能。
如果要實施SIFT或高斯差分關鍵點檢測器之類的方法,則使用第二種方法(或至少將平滑方法納入第一種方法)。
1. 效果圖
法一:未進行高斯平滑的金字塔效果圖:
使用高斯平滑的圖像金字塔效果圖如下:可能因為scikit-image版本 0.17.1原因,不支持彩色圖~~
可以看到高斯平滑的金字塔比不使用高斯平滑的級別少,這是因為高斯平滑的以1/2層級降,更快;
當設置不同的scale級別時,倆種方式能生成的級別也不一致,可以盡情試試。
2. 什么是圖像金字塔?
如上圖所示,圖像金字塔”是圖像的多尺度表示。最下面的圖擁有原始的圖像寬度、高度,每上一層,圖像的寬度與高度分別為之前的一半,并且進行了高斯平滑模糊等操作。
利用圖像金字塔,可以在圖像的不同比例下找到圖像中的對象。當與滑動窗口結合使用時,可以在各個位置的圖像中找到對象。
在金字塔的底部是原始圖像的原始大小(寬度和高度)。并在每個隨后的層上調整圖像大小(二次采樣)并可選地平滑(通常通過高斯模糊)。
逐步對圖像進行二次采樣,直到滿足某個停止標準為止,該標準通常已達到最小尺寸,并且無需進行進一步的二次采樣。
通常,性能和生成的層數之間需要權衡。比例因子越小,則需要創建和處理的圖層就越多-但這也使圖像分類器有更好的機會定位要在圖像中檢測的對象。
較大的比例因子將產生較少的圖層,并且可能會損害對象的分類性能。但是,由于要處理的層數較少,因此可以獲得更高的性能。
3. 依賴
- imutils
- scikit-image 安裝可參考
4. 源碼
# 圖像金字塔的倆種方法
# USAGE
# python pyramid.py --image images/_L3A4387.jpg --scale 1.5# 導入必要的包
import argparse
import imutils
import cv2from skimage.transform import pyramid_gaussian # 導入scikit圖像pyramid_gaussian函數# 構建金字塔
# - minSize 圖層所需的最小寬度和高度
def pyramid(image, scale=1.5, minSize=(30, 30)):# 產生原始圖像yield image# 保持循環金字塔模式while True:# 計算圖像新的規模大小,并保留寬高比的縮放圖像w = int(image.shape[1] / scale)image = imutils.resize(image, width=w)# 如果金字塔中的圖像低于此最小尺寸,將不再構建圖像金字塔# 停止循環if image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:break# 產生金字塔的下一張圖像yield image# 構建命令行參數及解析
# --image 原始圖像路徑
# --scale 控制在金字塔中調整圖像大小的比例因子
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())# 加載圖像
image = cv2.imread(args["image"])
image = imutils.resize(image, width=800)# 法一: 不平滑,只是縮放圖像
# 遍歷圖像金字塔
for (i, resized) in enumerate(pyramid(image, scale=args["scale"])):# 展示金字塔圖像結果cv2.imshow("Layer {}".format(i + 1), resized)cv2.waitKey(0)
# 關閉所有打開的窗口
cv2.destroyAllWindows()# 法二: 縮放+高斯平滑
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
for (i, resized) in enumerate(pyramid_gaussian(image, downscale=2)):# 如果圖像太小,則停止縮放if resized.shape[0] < 30 or resized.shape[1] < 30:break# 展示金字塔圖像結果cv2.imshow("pyramid_gaussian Layer {}".format(i + 1), resized)cv2.waitKey(0)
參考
- https://www.pyimagesearch.com/2015/03/16/image-pyramids-with-python-and-opencv/
總結
以上是生活随笔為你收集整理的使用Python和OpenCV构建图像金字塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python和OpenCV实现超快速
- 下一篇: 使用Python,OpenCV从图像中删