使用Python错误模糊图像

时间:2013-04-16 19:58:35

标签: python image-processing convolution

我需要通过获取内核K并对2D数组中的值进行平均并将中心值设置为K的平均值来模糊图像。这是我写的代码......

def Clamp(pix):
    pix = abs(pix)
    if pix > 255:
        pix = 255
    return pix

def Convolve2D(image1, K, image2):
    img = graphics.Image(graphics.Point(0, 0), image1)
    img.save(image2)
    secondimage=graphics.Image(graphics.Point(0,0),image2)
    h = img.getHeight()
    w = img.getWidth()
    A = [[0]*h for y in range(w)]
    B = [[0]*w for x in range(h)]
    #iterate over all rows (ignore 1-pixel borders) 
    for v in range(1, h-3):
        graphics.update() # this updates the output for each row
        # for every row, iterate over all columns (again ignore 1-pixel borders)
        for u in range(1, w-3):
            #A[u][v] = 0
            #B[u][v] = 0
            # for every pixel, iterate over region of overlap between
            #   input image and 3x3 kernel centered at current pixel
            for i in range (0, 3):
                for j in range (0, 3):
                    A[u][v] = A[u][v] + B[v+i][u+j] * K[i][j]
            r, g, b = img.getPixel(u, v)
            if (r * A[u][v] >= 255):
                Clamp(r)
            else:
                r = r * A[u][v]
            if (g * A[u][v] >= 255):
                Clamp(g)
            else:
                g = g * A[u][v]
            if (b * A[u][v] >= 255):
                Clamp(b)
            else:
                b = b * A[u][v]
            newcolor = graphics.color_rgb(r, g, b)
            secondimage.setPixel(u, v , newcolor)
    print("Not yet implemented") # to be removed
    secondimage.save(image2)
    secondimage.move(secondimage.getWidth()/2, secondimage.getHeight()/2)
    win = graphics.GraphWin(secondimage, secondimage.getWidth(), secondimage.getHeight())
    secondimage.draw(win)


def Blur3(image1, image2):
    K = [[1/9, 1/9, 1/9], [1/9, 1/9, 1/9], [1/9, 1/9, 1/9]]
    return Convolve2D(image1, K, image2)

这是我试图模糊的图像

enter image description here

这是我的代码

enter image description here

可能是我的if和else语句和钳位功能正在这样做吗?我只想要一个像这样的模糊图像

enter image description here

2 个答案:

答案 0 :(得分:0)

您已将AB初始化为空列表,其大小为0。您需要在两个维度中将它们初始化为图像的大小。

A = [[0]*w for y in range(h)]

编辑:您的第二个问题是您使用1/9来定义内核,这是一个产生0的整数除法。

答案 1 :(得分:0)

这样做:

for v in range(h):
        graphics.update() # this updates the output for each row
        for u in range(w):
             for i in range (0, 3):
                for j in range (0, 3):
                    if v-i>=0 and u-j>=0 and v+i<=256 and u+j<=256  :
                        img[u][v] = img[u][v] + img[v-i][u-j] * K[i][j]

这应该有用!

你能告诉我为什么你有两个图像A,B和模糊图像A使用B?我的意思是:

                    A[u][v] = A[u][v] + B[v+i][u+j] * K[i][j]

在这里,我添加了适用于灰度图像的代码,您可以根据需要进行扩展!

import matplotlib.image as mpimg

Img=mpimg.imread('GrayScaleImg.jpg')
kernel=towDimGuassKernel(size)

def conv2D(I,kernel):

    filterWidth=kernel.shape[0]
    half=filterWidth/2


    bluredImg=np.zeros(I.shape)
    for imgRow in range(I.shape[0]):
        print imgRow
        for imgCol in range(I.shape[1]):
            for filterRow in range(filterWidth):
                for filterCol in range(filterWidth):
                    if imgRow-filterRow>=0 and imgCol-filterCol>=0 and imgRow+filterRow<=256 and imgCol+filterCol<=256  :
                        bluredImg[imgRow,imgCol]+=I[imgRow-filterRow,imgCol-filterCol]*kernel[filterRow,filterCol]



    return bluredImg