我正在开发一个图像处理项目,我是Python的初学者并使用PIL。任何帮助将不胜感激。
所以,我正在做的是,我有一个有星星和噪音的空间图像。我想要做的只是保持较亮的像素并过滤掉枯燥的像素。目前,这是我尝试消除噪音的基本步骤。 在研究了图像数据之后,我发现205的值很可能是我想要保持阈值的值。
所以我在代码中做的是,打开图像并将包含205的像素值更改为黑色。 以下是相同的代码:
from PIL import Image
im = Image.open('nuvfits1.png')
pixelMap = im.load()
img = Image.new( im.mode, im.size)
pixelsNew = im.load()
for i in range(img.size[0]):
for j in range(img.size[1]):
if 205 in pixelMap[i,j]:
pixelMap[i,j] = (0,0,0,255)
pixelsNew[i,j] = pixelMap[i,j]
im.close()
img.show()
img.save("out.tif")
img.close()
问题是,结果图像只是纯白色屏幕。我做错了什么?
答案 0 :(得分:7)
if块后面应跟一个else块,这样不符合条件的“普通”像素会保留原始值。
from PIL import Image
im = Image.open('leaf.jpg')
pixelMap = im.load()
img = Image.new( im.mode, im.size)
pixelsNew = img.load()
for i in range(img.size[0]):
for j in range(img.size[1]):
if 205 in pixelMap[i,j]:
pixelMap[i,j] = (0,0,0,255)
else:
pixelsNew[i,j] = pixelMap[i,j]
img.show()
上面的代码给了我以下结果:
输入图片
输出图像
答案 1 :(得分:2)
你犯了一个愚蠢的错误。在第6行你写过
pixelsNew = im.load
()
而不是pixelsNew = img.load()
这应该现在有效。
from PIL import Image
im = Image.open('nuvfits1.png')
pixelMap = im.load()
img = Image.new( im.mode, im.size)
pixelsNew = img.load()
for i in range(img.size[0]):
for j in range(img.size[1]):
if 205 in pixelMap[i,j]:
pixelMap[i,j] = (0,0,0,255)
pixelsNew[i,j] = pixelMap[i,j]
im.close()
img.show()
img.save("out.tif")
img.close()
答案 2 :(得分:1)
你基本上需要一个去掉噪音的新图像,即pixelNew。
因此,只要在pixelMap if 205 in pixelMap[i,j]
中找到这样的情况,就将对应的值设置为0,以像素为单位pixelNew[i,j] = (0, 0, 0, 255)
。否则只需复制pixelMap pixelsNew[i,j] = pixelMap[i,j]
from PIL import Image
im = Image.open('nuvfits1.png')
pixelMap = im.load()
img = Image.new( im.mode, im.size)
pixelsNew = img.load()
for i in range(img.size[0]):
for j in range(img.size[1]):
if 205 in pixelMap[i,j]:
pixelsNew[i,j] = (0,0,0,255)
else:
pixelsNew[i,j] = pixelMap[i,j]
im.close()
img.show()
img.save("out.tif")
img.close()