使用Python和OpenCV进行中值过滤

mas*_*ejo 3 python opencv filter median

我尝试使用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()
Run Code Online (Sandbox Code Playgroud)

这是中值滤波器之前的图片: 来源图片

但是我得到了奇怪的结果,程序的结果: 最后的图片

Aur*_*ius 13

首先,我建议你不要重新发明轮子.OpenCV已经包含一个执行中值过滤的方法:

final = cv2.medianBlur(source, 3)
Run Code Online (Sandbox Code Playgroud)

也就是说,实现的问题在于迭代边界.你的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):
Run Code Online (Sandbox Code Playgroud)

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

中位数过滤结果

  • @mas_bejo 这可能最好通过提出一个单独的问题来解决。您的新问题需要更多解释,而评论并不是真正适合这样做的地方。 (2认同)