首頁 > 軟體

Python OpenCV實現圖片預處理的方法詳解

2022-09-30 14:01:28

一、圖片預處理

1.1 邊界填充(padding)

方法 : cv2.copyMakeBorder

BORDER_REPLICATE:複製法,也就是複製最邊緣畫素。

BORDER_REFLECT:反射法,對感興趣的影象中的畫素在兩邊進行復制例如:fedcba|abcdefgh|hgfedcb

BORDER_REFLECT_101:反射法,也就是以最邊緣畫素為軸,對稱,gfedcb|abcdefgh|gfedcba

BORDER_WRAP:外包裝法cdefgh|abcdefgh|abcdefg

BORDER_CONSTANT:常數法,常數值填充。

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:需要融合相加的兩副大小和通道數相等的影象
  • alpha:src1的權重
  • beta:src2的權重
  • gamma:gamma修正係數,不需要修正設定為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讀取通道數是最後一位

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: 當畫素值超過了閾值(或者小於閾值,根據type來決定),所賦予的值
  • type:二值化操作的型別,包含以下5種型別:
  • cv2.THRESH_BINARY 超過閾值部分取maxval(最大值),否則取0
  • cv2.THRESH_BINARY_INV THRESH_BINARY的反轉
  • cv2.THRESH_TRUNC 大於閾值部分設為閾值,否則不變
  • cv2.THRESH_TOZERO 大於閾值部分不改變,否則設為0
  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反轉

其效果如下:

二、濾波器

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原圖展示:

白色為圖片,黃色區域為濾波器視窗:

2.2 方框濾波器

# 方框濾波
# 基本和均值一樣,可以選擇歸一化
box = cv2.boxFilter(img, -1, (3, 3), normalize=True)

總結: 均值濾波器是取濾波器中的平均值,然後繼續滑動下一個視窗。

2.3 高斯濾波器

# 高斯濾波
# 高斯模糊的折積核裡的數值是滿足高斯分佈,相當於更重視中間的
aussian = cv2.GaussianBlur(img, (5, 5), 1)

總結: 高斯濾波器是濾波器視窗中離中心值近的權值大,用高斯分佈增加一個權重,然後繼續滑動下一個視窗。

2.4 中值濾波

# 中值濾波
# 相當於用中值代替
median = cv2.medianBlur(img, 5)  # 中值濾波

總結: 中值濾波器是濾波器視窗中所有數位的中間值,如黃色框中9個數的中間值為113,然後繼續滑動下一個視窗。

2.5 所有濾波器按照上述順序輸出

# 展示所有的
res = np.hstack((blur, aussian, median))
# print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

總結:中值濾波器的圖效果最好,可以解決一些椒鹽噪聲。

以上就是Python OpenCV實現圖片預處理的方法詳解的詳細內容,更多關於Python OpenCV圖片預處理的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com