欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv + python 实现中值、最大值、最小值滤波

程序员文章站 2022-03-23 12:54:13
...

中值滤波:

中值滤波其实就是对目标像素及周边像素取中值后再填回目标像素来实现滤波目的的方法。
优点:抑制椒盐噪点效果很好,画面的清析度基本保持;
缺点:对高斯噪声的抑制效果不是很好。

最大值滤波:

最大值滤波其实就是对目标像素及周边像素取最大值后再填回目标像素来实现滤波目的的方法。
最大值滤波可以去除图像中的暗斑,同时也会使亮斑增大(膨胀);

最小值滤波:

最小值滤波其实就是对目标像素及周边像素取最小值后再填回目标像素来实现滤波目的的方法。
最小值滤波可以去除图像中的亮斑,同时也会增大暗斑(腐蚀)。

代码

import cv2 as cv
import numpy as np
import math
import copy

def spilt( a ):
    if a/2 == 0:
        x1 = x2 = a/2
    else:
        x1 = math.floor( a/2 )
        x2 = a - x1
    return -x1,x2

def original (i, j, k,a, b,img):
    x1, x2 = spilt(a)
    y1, y2 = spilt(b)
    temp = np.zeros(a * b)
    count = 0
    for m in range(x1, x2):
        for n in range(y1, y2):
            if i + m < 0 or i + m > img.shape[0] - 1 or j + n < 0 or j + n > img.shape[1] - 1:
                temp[count] = img[i, j, k]
            else:
                temp[count] = img[i + m, j + n, k]
            count += 1
    return  temp 
    
#中值滤波
def mid_functin(a, b, img):
    img0 = copy.copy(img)
    for i in range(0, img.shape[0]):
        for j in range(2, img.shape[1]):
            for k in range(img.shape[2]):
                temp = original(i, j, k, a, b, img0)
                img[i, j, k] = np.median(temp)
    return img

#最大值滤波
def max_functin(a, b, img):
    img0 = copy.copy(img)
    for i in range(0, img.shape[0]):
        for j in range(2, img.shape[1]):
            for k in range(img.shape[2]):
                temp = original(i, j, k, a, b, img0)
                img[i, j, k] = np.max(temp)
    return img

#最小值滤波
def min_functin(a, b, img):
    img0 = copy.copy(img)
    for i in range(0, img.shape[0]):
        for j in range(2, img.shape[1]):
            for k in range(img.shape[2]):
                temp = original(i, j, k, a, b, img0)
                img[i, j, k] = np.min(temp)
    return img

def main():
    img0 = cv.imread(r"noise.jpg")

    mid_img = mid_functin(3, 3, copy.copy(img0) )
    max_img = max_functin(3, 3, copy.copy(img0))
    min_img = min_functin(3, 3, copy.copy(img0))

    cv.imshow("original", img0)
    cv.imshow("max_img",max_img)
    cv.imshow("min_img",min_img)
    cv.imshow("mid_img", mid_img)

    cv.waitKey(0)
    cv.destroyAllWindows()

if __name__ == "__main__":
    main()

示例

原图:

opencv + python 实现中值、最大值、最小值滤波

中值滤波:

opencv + python 实现中值、最大值、最小值滤波

最小值滤波:

opencv + python 实现中值、最大值、最小值滤波

最大值滤波:

opencv + python 实现中值、最大值、最小值滤波