Python 相同图像的不同背景,但大小不同
我有一些产品图片。这些图像的背景是白色的。现在,在我的网站上,我想在不同的地方使用不同大小的相同图像。问题是,因为图像背景的颜色是白色的。但是,作为缩略图,我需要的背景颜色是绿色。同样,作为主产品图像,我希望背景为浅蓝色。这里是一个图像的例子。 . 您可以看到此图像的背景是白色的。我想使用与缩略图相同的图像。我已经写了一个代码来生成图像的缩略图。但我想要背景色作为其他颜色。这可以最好用python进行图像处理吗? 多谢各位Python 相同图像的不同背景,但大小不同,python,image-processing,Python,Image Processing,我有一些产品图片。这些图像的背景是白色的。现在,在我的网站上,我想在不同的地方使用不同大小的相同图像。问题是,因为图像背景的颜色是白色的。但是,作为缩略图,我需要的背景颜色是绿色。同样,作为主产品图像,我希望背景为浅蓝色。这里是一个图像的例子。 . 您可以看到此图像的背景是白色的。我想使用与缩略图相同的图像。我已经写了一个代码来生成图像的缩略图。但我想要背景色作为其他颜色。这可以最好用python进行图像处理吗? 多谢各位 编辑:我无法评论任何答案,无法理解原因。请回复。如果您能容忍生成的图像中
编辑:我无法评论任何答案,无法理解原因。请回复。如果您能容忍生成的图像中出现一些丑陋的效果,那么这很简单。若这个背景颜色不同的图像显示为原始图像的缩小版本,那个么这些效果可能不明显,一切都很好 下面是一个简单的方法:
- 从(0,0)处的像素进行整体填充,假设它是背景像素(在您的示例中为白色),并在执行整体填充时接受细微差异。背景像素将替换为透明点
- 上面的步骤给出了一个掩码,例如,您可以执行腐蚀和高斯滤波
- 使用上面创建的遮罩粘贴“洪水填充”图像
如果mask[nx,ny]和abs(grayim[nx,ny]-start_color)以透明的方式将它们处理为4通道图像,这实际上很棘手,您需要处理链接图像中的jpg瑕疵,还需要处理背景像素,这些像素应该是白色的,但不是白色的。在那之后,你必须做出改变,使它看起来不那么可怕。我相信我在这个网站上看到了一个非常类似的问题,也许其他人知道我指的是什么,并会提供一个链接。@mmgp你想过这个问题吗@马克赎金是的,谢谢。事实上,我很惊讶被接受的答案与我的答案几乎相同,但这取决于Chan&Vese方法的实现,我不记得OpenCV和其他典型工具中有这种方法。问题是它假设背景色不存在于图像中,我的方法的问题是它假设对象没有孔。
import sys
import cv2
import numpy
from PIL import Image
def floodfill(im, grayimg, seed, color, tolerance=15):
width, height = grayimg.size
grayim = grayimg.load()
start_color = grayim[seed]
mask_img = Image.new('L', grayimg.size, 255)
mask = mask_img.load()
count = 0
work = [seed]
while work:
x, y = work.pop()
im[x, y] = color
for dx, dy in ((-1,0), (1,0), (0,-1), (0,1)):
nx, ny = x + dx, y + dy
if nx < 0 or ny < 0 or nx > width - 1 or ny > height - 1:
continue
if mask[nx, ny] and abs(grayim[nx, ny] - start_color) <= tolerance:
mask[nx, ny] = 0
work.append((nx, ny))
return mask_img
img = Image.open(sys.argv[1]).convert('RGBA')
width, height = img.size
img_p = Image.new('RGBA', (width + 20, height + 20), img.getpixel((0, 0)))
img_p.paste(img, (3, 3))
img = img_p
img_g = img.convert('L')
width, height = img.size
im = img.load()
mask = floodfill(im, img_g, (0, 0), (0, 0, 0, 0), 20)
mask = numpy.array(mask)
se = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
mask = cv2.erode(mask, se)
mask = cv2.GaussianBlur(mask, (9, 9), 3)
mask = Image.fromarray(mask)
result_bgcolor = (0, 0, 0, 255) # Change to match the color you wish.
result = Image.new('RGBA', (width, height), result_bgcolor)
result.paste(img_p, (0, 0), mask)
result.save(sys.argv[2])