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
,其中的 代表黑色
色白
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn1UeBpnT6FFVOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5cjN2IDOwIjM5ETMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(2)二值圖像的存儲
- 使用
存儲平面圖像四叉樹
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()
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()
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()
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()
- 使用
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()
2. 圖像金字塔
圖像金字塔原理
- 圖像金字塔是圖像多尺度表達的一種,是一種以多分辨率來解釋圖像的有效但概念簡單的結構。
- 一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐漸降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。
- 我們将一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。
高斯金字塔和拉普拉斯金字塔
- Reduce:先對圖像進行高斯模糊,再取出所有行和列中的偶數行和偶數列進行降采樣
- 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
- ladpalian_demo
【Python】OpenCV庫學習筆記(六)1. 圖像二值化2. 圖像金字塔