zoukankan      html  css  js  c++  java
  • 5-12 中值滤波

    中值滤波,顾名思义就是取中间值来代替原来像素值的过程。定义一个3*3的模板,在这个模板中总共有9个像素,我们把这9个像素进行排序。排序完之后,我们选取中间的一个值替换掉原来的像素值。还是通过源代码的形式来给大家实现这样一个过程。

    collect是一个数组。这个数组中装载的就是这9个元素。我们要对9个元素进行排序,并获取它的中间值。所以它的大小为9,数据类型仍然是uint8。我们使用两层for循环的形式来遍历图像上的每一个点。k描述的是下面我们即将装取数据的下标。我们使用m和n来表示当前的这个3*3模板的行和列。既然是一个3*3,所以我们从-1开始,到2结束。那么它包括-1、0、1这样三个点。

    两层for循环完之后,3*3的模板我们已经完成了当前所有像素到collect的数值中的装载。

    我们使用for循环来遍历一下当前的9个元素,完成大小的排序。我们同样也是定义两层for循环。这个排序算法非常的简单,先来给大家讲一下这个排序算法的原理。我们先拿第一个元素0和剩下8个元素进行比较,如果这个元素最大或者最小,那么我们就把它放到最后面去。0比较完了之后我们再来比较1,1的话我们再和1后面所有的元素进行比较。如果1这个元素比后面的元素都小,那么1这个元素依次往后移。这个是比较经典的排序算法。设置mid中间值,完成数据的交换。

    # 中值滤波 3*3
    import cv2
    import numpy as np
    img = cv2.imread('image11.jpg',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
    cv2.imshow('src',img)
    dst = np.zeros((height,width,3),np.uint8)
    collect = np.zeros(9,np.uint8)
    for i in range(0,height):
        for j in range(0,width):
            k = 0
            for m in range(-1,2):
                for n in range(-1,2):
                    gray = img[i+m,j+n]
                    collect[k] = gray
                    k = k+1
            # 0 1 2 3 4 5 6 7 8
            #   1
            for k in range(0,9):
                p1 = collect[k]
                for t in range(k+1,9):
                    if p1<collect[t]:
                        mid = collect[t]
                        collect[t] = p1
                        p1 = mid
             dst[i,j] = collect[4]
    cv2.imshow('dst',dst)
    cv2.waitKey(0)

    # 中值滤波 3*3
    import cv2
    import numpy as np
    img = cv2.imread('image11.jpg',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
    cv2.imshow('src',img)
    dst = np.zeros((height,width,3),np.uint8)
    collect = np.zeros(9,np.uint8)
    #for i in range(0,height):
        #for j in range(0,width):
    for i in range(1,height-1):
        for j in range(1,width-1):
            k = 0
            for m in range(-1,2):
                for n in range(-1,2):
                    gray = img[i+m,j+n]
                    collect[k] = gray
                    k = k+1
            # 0 1 2 3 4 5 6 7 8
            #   1
            for k in range(0,9):
                p1 = collect[k]
                for t in range(k+1,9):
                    if p1<collect[t]:
                        mid = collect[t]
                        collect[t] = p1
                        p1 = mid
            dst[i,j] = collect[4]
    cv2.imshow('dst',dst)
    cv2.waitKey(0)

    # 中值滤波 3*3
    import cv2
    import numpy as np
    img = cv2.imread('image13.jpg',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
    cv2.imshow('src',img)
    dst = np.zeros((height,width,3),np.uint8)
    collect = np.zeros(9,np.uint8)
    #for i in range(0,height):
        #for j in range(0,width):
    for i in range(1,height-1):
        for j in range(1,width-1):
            k = 0
            for m in range(-1,2):
                for n in range(-1,2):
                    gray = img[i+m,j+n]
                    collect[k] = gray
                    k = k+1
            # 0 1 2 3 4 5 6 7 8
            #   1
            for k in range(0,9):
                p1 = collect[k]
                for t in range(k+1,9):
                    if p1<collect[t]:
                        mid = collect[t]
                        collect[t] = p1
                        p1 = mid
            dst[i,j] = collect[4]
    cv2.imshow('dst',dst)
    cv2.waitKey(0)

  • 相关阅读:
    ubuntu20.04安装教程TLS,ubuntu安装教程20.04
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu20.04图文安装教程
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu安装教程20.04
    ubuntu19.10安装搜狗输入法,ubuntu19.10安装中文输入法
    ubuntu20.04安装搜狗输入法,ubunru安装搜狗输入法中文输入法拼音
    前端实现实时通讯
    移动端1px边框的实现
    利用js自动触发一个a标签的下载事件
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/9754535.html
Copyright © 2011-2022 走看看