Python?OpenCV實現(xiàn)圖片預(yù)處理的方法詳解
一、圖片預(yù)處理
1.1 邊界填充(padding)
方法 : cv2.copyMakeBorder
BORDER_REPLICATE:復(fù)制法,也就是復(fù)制最邊緣像素。
BORDER_REFLECT:反射法,對感興趣的圖像中的像素在兩邊進(jìn)行復(fù)制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最邊緣像素為軸,對稱,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包裝法cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常數(shù)值填充。
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('cat.png')
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
plt.show()
其效果如下:

cat.png原圖下載:

dog.png原圖下載:

1.2 融合圖片(mixup)
方法 : cv2.addWeighted(src1, alpha, src2, beta, gamma)
- src1, src2:需要融合相加的兩副大小和通道數(shù)相等的圖像
- alpha:src1的權(quán)重
- beta:src2的權(quán)重
- gamma:gamma修正系數(shù),不需要修正設(shè)置為0
import cv2
import matplotlib.pyplot as plt
img_cat = cv2.imread('cat.png')
img_cat = cv2.cvtColor(img_cat, cv2.COLOR_RGB2BGR)
cat_shape = [img_cat.shape[1], img_cat.shape[0]] # 因為cv2讀取通道數(shù)是最后一位
img_dog = cv2.imread('dog.png')
img_dog = cv2.cvtColor(img_dog, cv2.COLOR_RGB2BGR)
img_dog = cv2.resize(img_dog, cat_shape)
mixup = cv2.addWeighted(img_cat, 0.55, img_dog, 0.45, 0)
plt.imshow(mixup)
plt.show()
其效果如下:

1.3 圖像閾值
ret, dst = cv2.threshold(src, thresh, maxval, type)
- src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖
- dst: 輸出圖
- thresh: 閾值
- maxval: 當(dāng)像素值超過了閾值(或者小于閾值,根據(jù)type來決定),所賦予的值
- type:二值化操作的類型,包含以下5種類型:
- cv2.THRESH_BINARY 超過閾值部分取maxval(最大值),否則取0
- cv2.THRESH_BINARY_INV THRESH_BINARY的反轉(zhuǎn)
- cv2.THRESH_TRUNC 大于閾值部分設(shè)為閾值,否則不變
- cv2.THRESH_TOZERO 大于閾值部分不改變,否則設(shè)為0
- cv2.THRESH_TOZERO_INV THRESH_TOZERO的反轉(zhuǎn)
其效果如下:

二、濾波器
2.1 均值濾波器
import cv2
import numpy as np
img = cv2.imread('lenaNoise.png')
cv2.imshow('blur', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 均值濾波
# 簡單的平均卷積操作
blur = cv2.blur(img, (3, 3))
lenaNoise.png原圖展示:

白色為圖片,黃色區(qū)域為濾波器窗口:

2.2 方框濾波器
# 方框濾波 # 基本和均值一樣,可以選擇歸一化 box = cv2.boxFilter(img, -1, (3, 3), normalize=True)
總結(jié): 均值濾波器是取濾波器中的平均值,然后繼續(xù)滑動下一個窗口。
2.3 高斯濾波器
# 高斯濾波 # 高斯模糊的卷積核里的數(shù)值是滿足高斯分布,相當(dāng)于更重視中間的 aussian = cv2.GaussianBlur(img, (5, 5), 1)
總結(jié): 高斯濾波器是濾波器窗口中離中心值近的權(quán)值大,用高斯分布增加一個權(quán)重,然后繼續(xù)滑動下一個窗口。

2.4 中值濾波
# 中值濾波 # 相當(dāng)于用中值代替 median = cv2.medianBlur(img, 5) # 中值濾波
總結(jié): 中值濾波器是濾波器窗口中所有數(shù)字的中間值,如黃色框中9個數(shù)的中間值為113,然后繼續(xù)滑動下一個窗口。
2.5 所有濾波器按照上述順序輸出
# 展示所有的
res = np.hstack((blur, aussian, median))
# print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

總結(jié):中值濾波器的圖效果最好,可以解決一些椒鹽噪聲。
以上就是Python OpenCV實現(xiàn)圖片預(yù)處理的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖片預(yù)處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何用OpenCV -python3實現(xiàn)視頻物體追蹤
OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機(jī)視覺庫,可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。這篇文章主要介紹了如何用OpenCV -python3實現(xiàn)視頻物體追蹤,需要的朋友可以參考下2019-12-12
PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實現(xiàn)自動化操作的代碼實例
今天小編就為大家分享一篇關(guān)于PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實現(xiàn)自動化操作的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02
python爬蟲控制aiohttp并發(fā)數(shù)量方式
這篇文章主要介紹了python爬蟲控制aiohttp并發(fā)數(shù)量方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

