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)

  • 相关阅读:
    streamsets 集成 cratedb 测试
    streamsets k8s 部署试用
    streamsets rest api 转换 graphql
    StreamSets sdc rpc 测试
    StreamSets 相关文章
    StreamSets 多线程 Pipelines
    StreamSets SDC RPC Pipelines说明
    StreamSets 管理 SDC Edge上的pipeline
    StreamSets 部署 Pipelines 到 SDC Edge
    StreamSets 设计Edge pipeline
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/9754535.html
Copyright © 2011-2022 走看看