天天看點

【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

OpenCV庫學習筆記(六)

  • 1. 圖像二值化
    • 1.1 二值圖像(Binary Image)
    • 1.2 圖像二值化方法
    • 1.3 OpenCV相關API
      • 1.3.1 OTSU
      • 1.3.2 Triangle
      • 1.3.3 自動與手動
      • 1.3.4 局部門檻值
  • 2. 圖像金字塔
    • 圖像金字塔原理
    • 高斯金字塔和拉普拉斯金字塔

1. 圖像二值化

1.1 二值圖像(Binary Image)

(1)二值圖像的概念

  • 一張圖像隻有

    黑白

    兩個顔色
  • 下面圖像是就是一個

    二值圖像

    ,其中的

    1

    代表

    黑色

    ,其中的 代表

【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

(2)二值圖像的存儲

  • 使用

    四叉樹

    存儲平面圖像
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

1.2 圖像二值化方法

圖像二值化的方法:
  1. 全局門檻值
  2. 局部門檻值
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

1.3 OpenCV相關API

1.3.1 OTSU

import cv2 as cv
import numpy

def threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    print("threshold value %s" % ret)
    cv.imshow("Binary IMage", binary)

image = cv.resize(cv.imread("01.jpg"), (300,400))
cv.imshow("image", image)
threshold_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

1.3.2 Triangle

import cv2 as cv
import numpy


def threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
    print("threshold value %s" % ret)
    cv.imshow("Binary IMage", binary)


image = cv.resize(cv.imread("01.jpg"), (300,400))
cv.imshow("image", image)
threshold_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

1.3.3 自動與手動

import cv2 as cv
import numpy


def threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY)
    print("threshold value %s" % ret)
    cv.imshow("Binary IMage", binary)


image = cv.resize(cv.imread("01.jpg"), (300,400))
cv.imshow("image", image)
threshold_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

1.3.4 局部門檻值

  • 使用

    ADAPTIVE_THRESH_MEAN_C

import cv2 as cv
import numpy

def local_threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)
    cv.imshow("Binary IMage", binary)

image = cv.resize(cv.imread("01.jpg"), (300,400))
cv.imshow("image", image)
local_threshold_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔
  • 使用

    ADAPTIVE_THRESH_GAUSSIAN_C

import cv2 as cv
import numpy

def local_threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
    cv.imshow("Binary IMage", binary)

image = cv.resize(cv.imread("01.jpg"), (300,400))
cv.imshow("image", image)
local_threshold_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

2. 圖像金字塔

圖像金字塔原理

  • 圖像金字塔是圖像多尺度表達的一種,是一種以多分辨率來解釋圖像的有效但概念簡單的結構。
  • 一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐漸降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。
  • 我們将一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

高斯金字塔和拉普拉斯金字塔

  • Reduce:先對圖像進行高斯模糊,再取出所有行和列中的偶數行和偶數列進行降采樣
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔
  • Expand:先對圖像進行擴大,再對擴大的圖像進行卷積
import cv2 as cv


def pyramid_demo(image):
   level = 3
   temp = image.copy()
   pyramid_images = []
   for i in range(level):
       dst = cv.pyrDown(temp)
       pyramid_images.append(dst)
       cv.imshow("pyramid_down_" + str(i), dst)
       temp = dst.copy()
   return pyramid_images


def ladpalian_demo(image):
   pyramid_images = pyramid_demo(image)
   level = len(pyramid_images)
   for i in range(level - 1, -1, -1):
       if (i - 1) < 0:
           expand = cv.pyrUp(pyramid_images[i], dstsize=image.shape[:2])
           lpls = cv.subtract(image, expand)
           cv.imshow("laplalian_down_" + str(i), lpls)
       else:
           expand = cv.pyrUp(pyramid_images[i], dstsize=pyramid_images[i - 1].shape[:2])
           lpls = cv.subtract(pyramid_images[i - 1], expand)
           cv.imshow("laplalian_down_" + str(i), lpls)

image = cv.imread("01.jpg")
pyramid_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
  • pyramid_demo
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔
  • ladpalian_demo
    【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔

繼續閱讀