2

Wandを使用してPythonでグレースケールしようとしていますが、そうすると

from wand.image import Image
with Image(filename='image.png') as img:
    img.type = 'grayscale'
    img.save(filename='image_gray.png')

透明な背景を黒に変えます。背景が白いものを使用すると機能します。私は何を間違っていますか。また、グレースケーリングは

Y = 0.2126 * RED + 0.7152 * GREEN + 0.0722 * BLUE

値を少し変更したい場合など、Wand のどこで手動で行うことができますか。ドキュメントやさまざまなフォーラムを調べましたが、答えは見つかりませんでした。Photoshop に関するものだけでした。

ありがとう!

4

2 に答える 2

3

PNG 画像タイプをグレースケールに設定すると、透明レイヤーが削除されます ( PNG ドキュメントを参照)。1 つのオプションは、グレースケールを設定した後にアルファ チャネルを有効にすることです。

img.alpha = True
# or
img.background_color = Color('transparent')

お使いのバージョンによっては、これが機能しない場合があります。

別のオプション

Image.modulateで彩度を変更します。

img.modulate(saturation=0.0)

別のオプション

色空間を変更します。

img.colorspace = 'gray'
# or
img.colorspace = 'rec709luma'
# or
img.colorspace = 'rec601luma'

別のオプション

お使いのバージョンにImage.fx. 以下はうまくいくでしょう

with img.fx('lightness') as gray_copy:
   ....
于 2015-07-31T21:19:45.763 に答える
1

これはワンドに関するあなたの質問には答えません...しかし、あなたはそれをピルだけで十分に簡単に行うことができます...

from PIL import Image
from math import ceil
import q
def CalcLuminosity(RED,GREEN,BLUE):
    return int(ceil(0.2126 * RED + 0.7152 * GREEN + 0.0722 * BLUE))

im = Image.open('bird.jpg')
# im.convert("L")  will apply the standard luminosity mapping

data = [CalcLuminosity(*im.getpixel((c,r))) for r in range(im.height) for c in range(im.width) ]

#now make our new image using our luminosity values
x = Image.new("L",(im.width,im.height))
image_px = x.load()
for c in range(im.width):
    for r in range(im.height):
        image_px[c,r] = data[r*im.width+c]

x.save("output.jpg")

または、しきい値に基づいて極端に制限したい場合

#now make our new image using our luminosity values
x = Image.new("L",(im.width,im.height))
image_px = x.load()
for c in range(im.width):
    for r in range(im.height):
        image_px[c,r] = 0 if data[r*im.width+c] < 120 else 255

x.save("output.jpg")

または、単一の色のシャネルをフィルタリングしたい場合

def CalcLuminosityBLUE(RED,GREEN,BLUE):
    return BLUE
于 2015-07-31T19:48:12.023 に答える