2

商品画像があります。これらの画像の背景は白です。今、私のウェブサイトでは、さまざまな場所でさまざまなサイズの同じ画像を使用したいと思います。問題は、画像の背景の色が白であるためです。しかし、サムネイルとして必要な背景の色は緑です。同様に、メインの商品画像として、背景を水色にします。たとえば、これが画像です。 リンク。この画像の背景が白であることがわかります。サムネイルと同じ画像を使いたい。画像のサムネイルを生成するコードを作成しました。しかし、私は他の色として背景が欲しいです。これは、できればPythonでの画像処理で実行できますか?ありがとうございました。

編集:私は答えにコメントすることはできません、理由を理解することはできません。返信してください。

4

1 に答える 1

2

これは、結果の画像に多少の醜い影響を許容できる場合に行うのは簡単です。背景色が異なるこの画像が元の画像の縮小バージョンとして表示される場合、これらの効果は目立たない可能性があり、すべて問題ありません。

したがって、ここに簡単なアプローチがあります:

  • 背景ピクセル(この例では白)であると仮定して(0、0)のピクセルから塗りつぶし、塗りつぶしを実行するときにわずかな違いを受け入れます。背景のピクセルは透明な点に置き換えられます。
  • 上記の手順でマスクが得られ、たとえば侵食やガウス フィルタリングを実行できます。
  • 上で作成したマスクを使用して「塗りつぶし」画像を貼り付けます。

このアプローチから期待できることは次のとおりです。入力画像と、異なる背景色への 2 つの変換。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

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])
于 2013-02-11T20:51:33.633 に答える