python - 简单的 "blurring"数组表示来自第一原理的 python 中的图像

标签 python image-processing numpy python-imaging-library python-2.7

我有一个图像,它由两个任意放置的黑色 1px“ Blob ”组成,位于 100px x 200px 的白色 Canvas 上。我正在尝试“通过将一些相邻像素(在每个 Blob 的 10 像素半径内)也变黑来模糊这些 Blob 。我已经将以下代码放在一起,但我不太确定下一步..

import numpy as np
from PIL import Image 
from scipy import ndimage
from matplotlib import pyplot
from matplotlib import cm
from scipy.misc import imsave

im = Image.open("test.png")
pix = np.asarray(im)
new_pix = np.copy(pix[:,:,0]) # need this otherwise can't write to the pix array.
pix_to_enlarge = np.where(new_pix != 255)
pixels_to_enlarge_by = 10
i=0
for each_pixel in pix_to_enlarge[0]: # this cycles through each non-white pixel
    for y in range(len(new_pix)): # this looks across the length (down) the page
        for x in new_pix[y]: # this looks across the x-axis for each y step
            radius = pixels_to_enlarge_by**2

基本上我已经在变量 pixels_to_enlarge_by 中找到了非白色像素的位置。我正在尝试(到目前为止还没有做到)是选择周围的像素(在 10px 以内)并将它们也更改为黑色。有什么想法吗?

最佳答案

您需要以一种或另一种方式查看每个像素,然后计算出您希望将多少内容分配给图片中的每个其他像素,例如通过比较两者之间的距离。

下面是如何使用 numpy 完成的。如果您想手动执行此操作,那么这在任何情况下都可能有助于作为起点。这称为卷积2d convolution using python and numpy

这是关于高斯模糊的一个很好的起点: http://en.wikipedia.org/wiki/Gaussian_blur

但是如果你只是想做一个开/关模糊效果,那么与(卷积核)卷积的函数只是一个关于源点和任何可能的相邻像素之间距离的 if 语句。可以肯定的是,针对这种情况进行了优化:您的循环不需要跨越所有像素的所有像素,只要足以使大小为 R 的圆适合所考虑的范围即可。

既然你想要首要原则,那就来吧。它仅适用于 rgb 黑白

from PIL import Image 

im = Image.open("cat2.png")
px=im.load()
im2 = im.copy()
px2=im2.load()
sx,sy=im.size
def turnpixel(Nix,Niy):
    for ix in range(sx):
        for iy in range(sy):
            r2=(Nix-ix)**2+(Niy-iy)**2
            if r2<5:
                if sum(px[ix,iy])>100: # rgb sum>100 is considered ON.
                    px2[Nix,Niy]=(255,255,255)                            
                    return
                    # we turned a pixel on, so we are done with it.

for Nix in range(sx):
    for Niy in range(sy):
        px2[Nix,Niy]=(0,0,0)
        turnpixel(Nix,Niy)

im.show()
im2.show()

如果你想要一个作为距离函数的平滑,使用类似的东西

import math
def turnpixel(Nix,Niy):
    for ix in range(sx):
        for iy in range(sy):
            r=int(math.sqrt((Nix-ix)**2+(Niy-iy)**2))
            def convfunc(o,v):
                return o+int(v/(r*20+1))
            px2[Nix,Niy]=tuple(map(convfunc,px2[Nix,Niy],px[ix,iy]))
            if sum(px2[Nix,Niy])>=3*250:
                return

显然,如果您这样做,您应该对 float 进行操作,而不是整数。 并使用 numpy 或一些图像处理模块。

高斯模糊将是(在上面的函数中)。现在整数是一个非常糟糕的主意顺便说一句:

        inv2sigma2=1.0/(2*3)
        r2=(Nix-ix)**2+(Niy-iy)**2
        fact=inv2sigma2/(math.pi)*math.exp(-r2*inv2sigma2)
        def convfunc(o,v):
            return o+int(v*fact)

关于python - 简单的 "blurring"数组表示来自第一原理的 python 中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9471652/

相关文章:

python-3.x - 用 NAN 逐行替换 pandas 数据帧中的最后 2 个数值

python - 检查 numpy 数组的子维度中的元素是否在另一个 numpy 数组的子维度中的快速方法

python - 机器人框架运行关键字和预期错误

opencv - 如何在来自 vector<CvPoints> 或 vector<Point2f> 的图像上绘图?

python - 在python中创建具有一定宽度边框的图像

python - 如何通过移动顶点来倾斜图像?

python - Python 中的静态变量?

python - ValueError : could not broadcast input array from shape (224, 224,3) 成形 (224,224)

python - Spacy 日语分词器

python - 读取用python编写的c二进制文件