雖然現在基本都是直接呼叫OpenCv,但為了某些要求(我可沒說應付老師嗷)還需要自己實作,
本文:
1. 只完成了灰度圖
2.沒有做邊緣檢測
3. 效果肯定不用OpenCv好
原理:
自行百度
簡述一下,以影像中一個點為核心圈出一個k階矩陣,邊界不考慮,然后對這個k階矩陣求平均值,并將這個平均值賦給這個點,中值的字面意思,讓每個點中值一次
不多bb上代碼
首先匯入需要的庫
import cv2 import numpy as np from PIL import Image
這里opencv只負責讀存圖片
函式全部:
src要處理影像的路徑, dst新影像存的路徑, k 近鄰中值濾波器
def MedianFilter(src, dst, k, padding=None): img = cv2.imread(src,cv2.IMREAD_GRAYSCALE) height, width = img.shape[:2] if not padding: kk = int((k - 1) / 2) if height - 1 - kk <= kk or width - 1 - kk <= kk: print("K大的離譜了!") return None new_arr = np.zeros((height, width), dtype="uint8") for i in range(height): for j in range(width): # 判斷是否為邊界 if i <= kk - 1 or i >= height - 1 - kk or j <= kk - 1 or j >= height - kk - 1: new_arr[i, j] = img[i, j] else: # 中值濾波 new_arr[i, j] = np.median(imarray[i - kk:i + kk + 1, j - kk:j + kk + 1]) new_img = Image.fromarray(new_arr) new_img.save(dst)
匯入影像,求出寬高,簡單的判斷一下k是不是太大了
img = cv2.imread(src,cv2.IMREAD_GRAYSCALE)
height, width = img.shape[:2]
if not padding:
kk = int((k - 1) / 2)
if height - 1 - kk <= kk or width - 1 - kk <= kk:
print("K大的離譜了!")
return None
創建一個跟原圖大小一樣的空矩陣
new_arr = np.zeros((height, width), dtype="uint8")
開始回圈,先判斷一下是不是邊界,如果是則照抄原影像,不是則進行中值濾波
np.median()求一個矩陣的平均值,最后 new_img = Image.fromarray(new_arr)把矩陣換為影像并保存
np.median(imarray[i - kk:i + kk + 1, j - kk:j + kk + 1])
for i in range(height):
for j in range(width):
# 判斷是否為邊界
if i <= kk - 1 or i >= height - 1 - kk or j <= kk - 1 or j >= height - kk - 1:
new_arr[i, j] = img[i, j]
else: # 中值濾波
new_arr[i, j] = np.median(imarray[i - kk:i + kk + 1, j - kk:j + kk + 1])
new_img = Image.fromarray(new_arr)
new_img.save(dst)
呼叫:
src = "dilireba.png"
dst = "dilireba2.png"
k = 3
MedianFilter(src, dst, k)
通俗易懂!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325855.html
標籤:其他
