【问题标题】:How to remove the borders and some white pixels out borders?如何去除边框和边框外的一些白色像素?
【发布时间】:2015-08-10 17:17:43
【问题描述】:

我有生成图像的下一个代码:

...
fig = plt.figure(figsize=size,dpi=dpi)
ax = fig.add_axes([0, 0, 1, 1])

# remove top and right spines
ax.spines['right'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('none')
# turn off ticks
ax.xaxis.set_ticks_position('none')
ax.yaxis.set_ticks_position('none')
ax.xaxis.set_ticklabels([])
ax.yaxis.set_ticklabels([])

plt.imshow(bt, cmap='g_cm')
plt.set_cmap('g_cm') # Grayscale
plt.savefig(outfilename) 

在此之后,我使用下一个代码放置具有透明度的背景(白色 - 255,255,255)。

...
img = Image.open(filename) 
img = img.convert("RGBA")
pixdata = img.load()
if pixdata[x,y] == (255,255,255,255):
        pixdata[x,y] = (255,255,255,0)

我可以将透明度应用于背景,但图像的几个区域保持边框((灰暗))并且边框外的一些像素是白色的。

如何去除这些边框和白色像素?

谢谢

【问题讨论】:

  • 我不确定您所说的“像素超出边界”是什么意思
  • 或许可以添加一些图片来展示您想要完成的工作。
  • 我的精神力量告诉我 OP 有一些不是很白的像素,这些像素在图像的不透明部分附近产生了难看的锯齿状边缘。 OP 可能想要某种模糊选择,比如魔术棒工具。

标签: python python-imaging-library pillow


【解决方案1】:

如果您要说的是一些几乎是白色但不完全的像素没有被替换,那么您可能希望使大部分白色透明的东西也变得透明,而不仅仅是纯白色像素。

尝试以下操作:

img = Image.open(filename) 
img = img.convert("RGBA")
pixdata = img.load()
if sum(pixdata[x, y][:3]) > 240 * 3:
        pixdata[x, y] = (255, 255, 255, 0)

【讨论】:

  • @nars 这张图片是“之前”还是“之后”?如果您不向我们提供清晰的示例图像,说明您从什么开始以及您想要完成什么,那么您将很难理解您的问题。
  • @nars 请尝试澄清您的问题。 “像素超出边界”没有意义。另外,避免使用tinypic。使用 imgur 代替图像托管。
  • 下一张图片说明了我要删除(边框和白色像素外边框)。绿色背景只是为了可视化这些部分(边框..)!Explanation.
  • 我仍然不确定您是指 外部 边界(无论这可能意味着什么),还是完全其他的东西。不要使用术语“边界外”,因为它不是一个实际术语。图片并没有真正说明这一点。尝试将240 更改为较低的值,看看会发生什么。
  • 如果我输入一个小于 255 的值(例如:240),将剪切图像的信息(参见图像 3 - 右下角),因为我使用的是灰度。 !Image3.
【解决方案2】:

要去除具有一定阈值的白色像素,可以使用库ImageChops

代码

'''
Created on Aug 12, 2015

@author: physicalattraction
'''

from PIL import Image, ImageChops, ImageDraw

def create_image():
    # Image initialization
    W, H = 800, 600
    img = Image.new('RGBA', (W, H), (255, 255, 255))
    draw = ImageDraw.Draw(img)

    # Create rugged edge that should become transparent 
    r = 25
    draw.rectangle([r, r, W - r, H - r], fill=(254, 254, 254), outline=None)

    # Create image that should not become transparent
    r = 100
    draw.rectangle([r, r, W - r, H - r], fill=(255, 0, 0), outline=None)

    img.save('img/bg_removal_original.png')

    return img

def remove_white_background_naive(img):
    W, H = img.size
    for x in range(W):
        for y in range(H):
            if img.getpixel((x, y)) == (255, 255, 255, 255):
                # Make transparent.
                # Now making grey to easier show on screen that it works.
                img.putpixel((x, y), (128, 128, 128))  


    img.save('img/bg_removal_naive.png')

def remove_white_background_with_chops(img):
    fuzz = 2.5  # Choose a value greater than 0. Play around for optimal results.
    bg = Image.new(img.mode, img.size, img.getpixel((0, 0)))
    diff = ImageChops.difference(img, bg)
    diff = ImageChops.add(diff, diff, fuzz, -100)

    W, H = img.size
    for x in range(W):
        for y in range(H):
            if diff.getpixel((x, y)) == (0, 0, 0, 0):
                # Make transparent.
                # Now making grey to easier show on screen that it works.
                img.putpixel((x, y), (128, 128, 128))

    img.save('img/bg_removal_with_chops.png')

if __name__ == '__main__':
    img = create_image()
    remove_white_background_naive(img)
    remove_white_background_with_chops(img)

结果

原文:

天真:

使用 ImageChops:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多