简单的;模糊的;在python中表示图像的数组的
我有一个图像,它由两个任意放置的黑色1px“斑点”组成,在一张100像素x 200像素的白色画布上。我正试图“通过将一些相邻像素(每个像素的半径为10px)变黑来模糊这些斑点。我已经编写了以下代码,但不太确定下一步是什么简单的;模糊的;在python中表示图像的数组的,python,image-processing,numpy,python-imaging-library,python-2.7,Python,Image Processing,Numpy,Python Imaging Library,Python 2.7,我有一个图像,它由两个任意放置的黑色1px“斑点”组成,在一张100像素x 200像素的白色画布上。我正试图“通过将一些相邻像素(每个像素的半径为10px)变黑来模糊这些斑点。我已经编写了以下代码,但不太确定下一步是什么 import numpy as np from PIL import Image from scipy import ndimage from matplotlib import pyplot from matplotlib import cm from scipy.misc
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
因此,基本上我已经找到了可变像素中非白色像素的位置。我正在尝试(到目前为止没有做到)选择周围的像素(在10px内)你有什么想法吗?你需要看看每一个像素,然后计算出你想把多少内容分发给图片中的每一个像素,例如通过比较两个像素之间的距离 以下是numpy的实现方法。如果您想手动完成,那么这在任何情况下都可以作为一个起点。它被称为卷积。 关于高斯模糊,这里有一个很好的起点: 但是如果你只是想做一个开/关模糊效果,那么卷积函数(卷积核)只是关于源点和任何可能的相邻像素之间距离的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()
很明显,如果你这样做的话,你应该在浮点上操作,而不是整数。并使用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)
在某种程度上,你需要查看每个像素,然后计算出你想要在图片中向每个像素分发多少内容,例如通过比较两个像素之间的距离 以下是numpy的实现方法。如果您想手动完成,那么这在任何情况下都可以作为一个起点。它被称为卷积。 关于高斯模糊,这里有一个很好的起点: 但是如果你只是想做一个开/关模糊效果,那么卷积函数(卷积核)只是关于源点和任何可能的相邻像素之间距离的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()
很明显,如果你这样做的话,你应该在浮点上操作,而不是整数。并使用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)
标准方法是使用a。如果你想要全部黑白,你需要在做卷积后应用阈值。标准方法是使用a。如果你想要全部黑白,你需要在做卷积后应用阈值。哇,你真的超越了,谢谢!这是一个很大的帮助!谢谢。这很有趣。还有一些更微妙的事情:当你接近一个边缘时,一个真正的卷积应该能够处理超出图片边缘的可能的输入/输出信息流。如果你只是使用我的高斯模糊代码,你会注意到物体在那里变得更模糊。哇,你真的超越了,谢谢!这是一个很大的帮助!谢谢。这很有趣。还有一些更微妙的事情:当你接近边缘时,一个真正的卷积应该能够处理超出图片边缘的可能的信息输入/输出流量。如果你只是使用我的高斯模糊代码,你会注意到物体在那里变得更模糊。