Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 相同图像的不同背景,但大小不同_Python_Image Processing - Fatal编程技术网

Python 相同图像的不同背景,但大小不同

Python 相同图像的不同背景,但大小不同,python,image-processing,Python,Image Processing,我有一些产品图片。这些图像的背景是白色的。现在,在我的网站上,我想在不同的地方使用不同大小的相同图像。问题是,因为图像背景的颜色是白色的。但是,作为缩略图,我需要的背景颜色是绿色。同样,作为主产品图像,我希望背景为浅蓝色。这里是一个图像的例子。 . 您可以看到此图像的背景是白色的。我想使用与缩略图相同的图像。我已经写了一个代码来生成图像的缩略图。但我想要背景色作为其他颜色。这可以最好用python进行图像处理吗? 多谢各位 编辑:我无法评论任何答案,无法理解原因。请回复。如果您能容忍生成的图像中

我有一些产品图片。这些图像的背景是白色的。现在,在我的网站上,我想在不同的地方使用不同大小的相同图像。问题是,因为图像背景的颜色是白色的。但是,作为缩略图,我需要的背景颜色是绿色。同样,作为主产品图像,我希望背景为浅蓝色。这里是一个图像的例子。 . 您可以看到此图像的背景是白色的。我想使用与缩略图相同的图像。我已经写了一个代码来生成图像的缩略图。但我想要背景色作为其他颜色。这可以最好用python进行图像处理吗? 多谢各位


编辑:我无法评论任何答案,无法理解原因。请回复。

如果您能容忍生成的图像中出现一些丑陋的效果,那么这很简单。若这个背景颜色不同的图像显示为原始图像的缩小版本,那个么这些效果可能不明显,一切都很好

下面是一个简单的方法:

  • 从(0,0)处的像素进行整体填充,假设它是背景像素(在您的示例中为白色),并在执行整体填充时接受细微差异。背景像素将替换为透明点
  • 上面的步骤给出了一个掩码,例如,您可以执行腐蚀和高斯滤波
  • 使用上面创建的遮罩粘贴“洪水填充”图像
以下是您可以从这种方法中得到的结果。输入图像,然后将两个变换为不同的背景色

导入系统 进口cv2 进口numpy 从PIL导入图像 def泛光填充(im、灰度、种子、颜色、公差=15): 宽度、高度=灰色img.size grayim=grayimg.load() 开始颜色=灰色[种子] mask\u img=Image.new('L',grayimg.size,255) mask=mask_img.load() 计数=0 工作=[种子] 工作期间: x、 y=work.pop() im[x,y]=颜色 对于dx,dy in(-1,0)、(1,0)、(0,-1)、(0,1)): nx,ny=x+dx,y+dy 如果nx<0或ny<0或nx>宽度-1或ny>高度-1: 持续
如果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])