如何在python中手动模糊图像?

时间:2017-04-25 15:57:26

标签: python image image-processing coordinates sage

在下面的代码中,我试图通过用周围像素的平均值替换每个像素来模仿python中的图像,只要原始像素不在图像的边界处。但是,每当我运行我的代码时,我只是收到一个黑色图像。谁能告诉我我做错了什么?

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import imread, imsave, imresize

imgOld = imread('house.png') # read image into a numpy array
imgNew = imgOld
(imgH, imgW, imgC) = imgOld.shape # imgC = 2 or 4 (RGB or RGBA)
plt.imshow(imgOld, origin='lower')

# blur
for y in range(imgH):
    for x in range(imgW):
        xLast = 0
        yLast = 0
        if x != 0 and y != 0:
            xLast = (x-1) % imgW
            yLast = (y-1) % imgH
        else:
            xLast = 0
            yLast = 0
        xNext = (x+1) % imgW
        yNext = (y+1) % imgH
        rgb = imgNew[y,x]
        r = (imgOld[yLast,xLast,2]
                    + imgOld[yLast,x,2]
                    + imgOld[yLast,xNext,2]
                    + imgOld[y,xLast,2]
                    + imgOld[y,x,2]
                    + imgOld[y,xNext,2]
                    + imgOld[yNext,xLast,2]
                    + imgOld[yNext,x,2]
                    + imgOld[yNext,xNext,2]) / 9
        g = (imgOld[yLast,xLast,1]
                    + imgOld[yLast,x,1]
                    + imgOld[yLast,xNext,1]
                    + imgOld[y,xLast,1]
                    + imgOld[y,x,1]
                    + imgOld[y,xNext,1]
                    + imgOld[yNext,xLast,1]
                    + imgOld[yNext,x,1]
                    + imgOld[yNext,xNext,1]) / 9
        b = (imgOld[yLast,xLast,0]
                    + imgOld[yLast,x,0]
                    + imgOld[yLast,xNext,0]
                    + imgOld[y,xLast,0]
                    + imgOld[y,x,0]
                    + imgOld[y,xNext,0]
                    + imgOld[yNext,xLast,0]
                    + imgOld[yNext,x,0]
                    + imgOld[yNext,xNext,0]) / 9
        imgNew[y,x] = [b,g,r]
plt.imshow(imgNew, origin='lower')

编辑:我已根据每个像素的单个颜色值更新了我的代码,但是我仍然收到黑色图像。

我正在添加我的完整工作java版本的代码。我不明白我哪里出错了

Java版:

protected void proc_17() {
    info = "Blur";
    for (int y = 0; y < imgH; y++) {
        for (int x = 0; x < imgW; x++) {
            int xLast = 0;
            int yLast = 0;
            if (x != 0 && y != 0) {
                xLast = (x-1) % imgW;
                yLast = (y-1) % imgH;
            } else {
                xLast = 0;
                yLast = 0;
            }
            int xNext = (x+1) % imgW;
            int yNext = (y+1) % imgH;
            float r = (imgOld.getR(xLast, yLast) 
                    + imgOld.getR(x, yLast) 
                    + imgOld.getR(xNext, yLast) 
                    + imgOld.getR(xLast, y) 
                    + imgOld.getR(x, y) 
                    + imgOld.getR(xNext, y) 
                    + imgOld.getR(xLast, yNext) 
                    + imgOld.getR(x, yNext) 
                    + imgOld.getR(xNext, yNext)) / 9;
            float g = (imgOld.getG(xLast, yLast) 
                    + imgOld.getG(x, yLast) 
                    + imgOld.getG(xNext, yLast) 
                    + imgOld.getG(xLast, y) 
                    + imgOld.getG(x, y) 
                    + imgOld.getG(xNext, y) 
                    + imgOld.getG(xLast, yNext) 
                    + imgOld.getG(x, yNext)
                    + imgOld.getG(xNext, yNext)) / 9;
            float b = (imgOld.getB(xLast, yLast) 
                    + imgOld.getB(x, yLast) 
                    + imgOld.getB(xNext, yLast) 
                    + imgOld.getB(xLast, y) 
                    + imgOld.getB(x, y) 
                    + imgOld.getB(xNext, y) 
                    + imgOld.getB(xLast, yNext) 
                    + imgOld.getB(x, yNext) 
                    + imgOld.getB(xNext, yNext)) / 9;
            imgNew.setR(x, y, r);
            imgNew.setG(x, y, g);
            imgNew.setB(x, y, b);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这段代码的问题在于它没有将变量 r、g 和 b 中的值相加。 这可能是缩进的原因,所以我把这些值列成一个列表,做总和,然后除以9。 按照以下脚本操作:

 imgOld = imread('house.png') # read image into a numpy array imgNew =
 imgOld (imgH, imgW, imgC) = imgOld.shape # imgC = 2 or 4 (RGB or RGBA)
 
 plt.imshow(imgOld, vmin=0, vmax=255) plt.show()
 
 # blur for y in range(imgH):
     for x in range(imgW):
         xLast = 0
         yLast = 0
         if x != 0 and y != 0:
             xLast = (x-1) % imgW
             yLast = (y-1) % imgH
         else:
             xLast = 0
             yLast = 0
         xNext = (x+1) % imgW
         yNext = (y+1) % imgH
         rgb = imgNew[y,x]
 
         aux_r = (imgOld[yLast,xLast,2],
                       imgOld[yLast,x,2],
                       imgOld[yLast,xNext,2],
                       imgOld[y,xLast,2],
                       imgOld[y,x,2],
                       imgOld[y,xNext,2],
                       imgOld[yNext,xLast,2],
                       imgOld[yNext,x,2],
                       imgOld[yNext,xNext,2])
         r = sum(aux_r)
         r = r/9
         aux_g = (imgOld[yLast,xLast,1],
                       imgOld[yLast,x,1],
                       imgOld[yLast,xNext,1],
                       imgOld[y,xLast,1],
                       imgOld[y,x,1],
                       imgOld[y,xNext,1],
                       imgOld[yNext,xLast,1],
                       imgOld[yNext,x,1],
                       imgOld[yNext,xNext,1])
         g = sum(aux_g)
         g = g/9
 
         aux_b = (imgOld[yLast,xLast,0],
                       imgOld[yLast,x,0],
                       imgOld[yLast,xNext,0],
                       imgOld[y,xLast,0],
                       imgOld[y,x,0],
                       imgOld[y,xNext,0],
                       imgOld[yNext,xLast,0],
                       imgOld[yNext,x,0],
                       imgOld[yNext,xNext,0])
         b = sum(aux_b)
         b = b/9
             
         imgNew[y,x] = [b,g,r] plt.imshow(imgNew, vmin=0, vmx=255) plt.show()