opencv python 影像模糊與反鋸齒處理

Posted in :

很實用的技能,建議學起來。一行指令就搞定了。好強的 OpenCV

如果還沒有安裝opencv 請服用下面的指令:

python3 -m pip install opencv-python

影象平滑技術如高斯模糊,Median模糊等,模糊真的很好用,因為模糊捨棄了「細節」,再結合二值化(Image Thresholding),就可以讓原有的資訊變的更圓潤和飽滿,可以做出反鋸齒(Anti-aliasing)的效果。

OpenCV 的平滑模糊化技術:

  • 平均濾波 Averaging:使用 opencv 的 cv2.blur 或 cv2.boxFilter
  • 高斯濾波 Gaussian Filtering:使用 opencv 的 cv2.GaussianBlur
  • 中值濾波 Median Filtering:使用 opencv 的 cv2.medianBlur
  • 雙邊濾波 Bilateral Filtering:使用 opencv 的 cv2.bilateralFilter

使用範例:

import cv2
import numpy as np
img = cv2.imread('opencv-logo-white.png')
blur = cv2.blur(img,(5,5))

二值化

影像二值化簡單的方法,如果像素值pixel大於門檻值threshold,就指定一個新數值(例如白色),否則就指定另一個新數值(例如黑色),
這邊使用 opencv 的 cv2.threshold,第一個參數來源需要是灰階影像,第二個參數是用來對像素值進行分類的門檻值,第三個參數為最大灰階值,第四個參數為二值化的類型如下所示:
cv2.THRESH_BINARY:Threshold Binary,即二值化,將大於門檻值的灰階值設為最大灰階值,小於門檻值的值設為0。
cv2.THRESH_BINARY_INV:Threshold Binary, Inverted,將大於門檻值的灰階值設為0,其他值設為最大灰階值。
cv2.THRESH_TRUNC:Truncate,將大於門檻值的灰階值設為門檻值,小於門檻值的值保持不變。
cv2.THRESH_TOZERO:Threshold to Zero,將小於門檻值的灰階值設為0,大於門檻值的值保持不變。
cv2.THRESH_TOZERO_INV:Threshold to Zero, Inverted,將大於門檻值的灰階值設為0,小於門檻值的值保持不變。

使用範例:

import cv2
import numpy as np
img = cv2.imread('your-image.png', 0)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

執行結果

1:使用 Blur + threshold

右邊是原圖,右邊是套用效果後。

2:使用 GaussianBlur + threshold

右邊是原圖,右邊是套用效果後。

3:使用 medianBlur + threshold

右邊是原圖,右邊是套用效果後。

心得,使用起來差異不會很大,但Blur 可以調的模糊程度會較高,較大的筆觸會造成較嚴重的暈染效果,還有筆畫相連。先降噪,blur ,再降噪,再取二值化,這些步驟重覆並交叉套用,效果也很好!


相關文章

Smoothing Images
https://docs.opencv.org/4.5.2/d4/d13/tutorial_py_filtering.html

影像平滑模糊化 blur
https://shengyu7697.github.io/python-opencv-blur/

影像二值化 Image Thresholding
https://shengyu7697.github.io/python-opencv-threshold/

opencv python 影像去噪
https://stackoverflow.max-everyday.com/2021/07/opencv-python-image-denoise/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *