【问题标题】:Median Filter with Python and OpenCV使用 Python 和 OpenCV 的中值滤波器
【发布时间】:2013-08-27 22:24:26
【问题描述】:

我尝试为做中值滤波器制作 python 程序。我得到了这篇文章 http://www.programming-techniques.com/2013/02/median-filter-using-c-and-opencv-image.html ,所以我尝试将那个代码翻译成 python 代码。

这是python中的代码

from cv2 import * #Import functions from OpenCV
import cv2

if __name__ == '__main__':
    source = cv2.imread("Medianfilterp.png", CV_LOAD_IMAGE_GRAYSCALE)
    final = source[:]
    for y in range(len(source)):
        for x in range(y):
            final[y,x]=source[y,x]

    members=[source[0,0]]*9
    for y in range(1,len(source)-1):
        for x in range(1,y-1):
            members[0] = source[y-1,x-1]
            members[1] = source[y,x-1]
            members[2] = source[y+1,x-1]
            members[3] = source[y-1,x]
            members[4] = source[y,x]
            members[5] = source[y+1,x]
            members[6] = source[y-1,x+1]
            members[7] = source[y,x+1]
            members[8] = source[y+1,x+1]

            members.sort()
            final[y,x]=members[4]

    cv.NamedWindow('Source_Picture', cv.CV_WINDOW_AUTOSIZE)
    cv.NamedWindow('Final_Picture', cv.CV_WINDOW_AUTOSIZE)
    cv2.imshow('Source_Picture', source) #Show the image
    cv2.imshow('Final_Picture', final) #Show the image
    cv2.waitKey()

这是中值滤波前的图片:

但我得到了奇怪的结果,程序的结果:

【问题讨论】:

    标签: python opencv filter median


    【解决方案1】:

    首先,我建议你不要re-invent the wheel。 OpenCV 已经包含了执行中值滤波的方法:

    final = cv2.medianBlur(source, 3)
    

    也就是说,您的实现问题在于您的迭代界限。您的 y 范围是正确的。但是,for x in range(1,y-1): 仅迭代到当前的 y 值,而不是图像的整个 x 范围。这就解释了为什么过滤器只应用于图像左下角的三角形区域。您可以使用图像的shape 字段(实际上只是一个 numpy 数组)来获取图像尺寸,然后可以对其进行迭代:

    for y in range(1,source.shape[0]-1):
        for x in range(1,source.shape[1]-1):
    

    这会将过滤器应用于整个图像:

    【讨论】:

    • 我只是想学习如何做中值过滤,而不仅仅是调用一个函数。谢谢。。我没注意到。哈哈..解决了我的问题,但是,我遇到了新问题,当我将图片裁剪一半时,它说列表出站。你知道为什么吗?
    • @mas_bejo 这可能最好通过提出一个单独的问题来解决。您的新问题需要更多解释,而 cmets 并不是真正适合这样做的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2017-08-11
    • 2017-09-19
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多