3

私の名前が示すように、私はコーディングが初めてで、Python を使用していて、タスクを完了するために Python Imaging Library を使用する際に助けていただければ幸いです。

私は2つのビットマップ画像を持っています。最初の画像はカラー絵画で、2 番目の画像には白黒のピクセルのみが含まれています... 2 つの画像をパラメーターとして受け入れて、本質的に最初の画像 (絵画) である新しい画像を作成する関数を開発したいと思います。その上に上書きされた 2 番目の画像の黒いピクセルのみ。2 番目の画像は最初の画像よりも小さく、上書きされたピクセルは新しい画像の中央に配置する必要があります。

PIL をインストールし、次のコードを使用して最初の画像を正常に表示することができました。

import PIL
from PIL import Image

painting = Image.open("painting.bmp")
painting.show()

画像が同じサイズではないため、ImageChops モジュールの .blend 関数と .composite 関数、または .multiply 関数の使用を除外しました。

タプル (0,0,0) で識別される黒いピクセルを見つけるには、.getpixel / .putpixel または .getdata / .putdata のいずれかを使用する必要があると思います。また、私が考えているPILの切り取りと貼り付け機能は、絵画から「領域」を見つけて黒いピクセルで上書きするのに役立ち、黒いピクセルを絵画の中央に配置するのに役立つと思いますか?

だから私は多分このようなものを見ています...

def overwrite_black(image1, image2): 

image_1 = Image.open('painting.bmp') 
image_2 = Image.open('black_white.bmp') 
pixels = list(image_2.getdata())

for y in xrange(image_2.size[1]):
    for x in xrange(image_2.size[0]):
        if pixels ==(o,o,o):
          image_2.putdata(pixels((x,y),(0,0,0)))

image_2.save('painted.bmp')

繰り返しますが、私は新しいので、気楽に行ってください。どんな助けでも大歓迎です。

乾杯。

4

2 に答える 2

3

だから、2つの画像を重ね合わせたいだけだと思いますが、サイズが異なるという問題がありますか? 誤解していた場合は申し訳ありませんが、白黒画像が他の画像よりも小さい場合でも、ある画像の黒いピクセルを別の画像に配置するコードを次に示します。

ソース画像 (painting.bmpおよびmask.bmp)

ペインティングマスク

出力:

結果

「...本質的に最初の画像(絵)であり、2番目の画像の黒いピクセルだけがその上に上書きされた新しい画像。」- これは、あなたの望むことですか?


基本的に、このコードは、最初の画像と同じサイズの空白の画像の中央に小さい画像を配置することで、小さい画像を最初の画像と同じ大きさにするだけです。

import PIL
from PIL import Image
from PIL import ImageChops # used for multiplying images

# open images
painting = Image.open("painting.bmp")
mask     = Image.open("mask.bmp")


def black_onto(img1, img2):  
    # create blank white canvas to put img2 onto
    resized = Image.new("RGB", img1.size, "white")

    # define where to paste mask onto canvas
    img1_w, img1_h = img1.size
    img2_w, img2_h = img2.size
    box = (img1_w/2-img2_w/2, img1_h/2-img2_h/2, img1_w/2-img2_w/2+img2_w, img1_h/2-img2_h/2+img2_h)

    # multiply new mask onto image
    resized.paste(img2, box)
    return ImageChops.multiply(img1, resized)


out = black_onto(painting, mask)
out.show() # this gives the output image shown above

説明:(img1_w/2-img2_w/2, img1_h/2-img2_h/2, img1_w/2-img2_w/2+img2_w, img1_h/2-img2_h/2+img2_h)

さて、これは見苦しい部分ですが、実際には非常に単純です:boxマスクを配置したいキャンバス上の領域、つまり中心を定義します。次のように、領域の左上隅と右下隅boxの x と y を定義する 4 つの値のタプルです。x、y、幅、高さではなく、より便利です。とにかく、画像が中央に配置されるように領域を定義するには、そのコードを取得します。(x1, y1, x2, y2)

左上隅の x 値は、大きな画像の幅の半分からマスク画像の幅の半分を引いた値に等しくなります。(ここではペンと紙が役に立ちます。) 同じことが左上隅の y 値にも当てはまります。それが最初の 2 つの値です。

ここで、タプルが を受け入れた場合(x, y, width, height)、2 番目の 2 つの値はマスク イメージの寸法になります。しかし、そうではありません。より多くの x と y の位置です。そのため、最初の 2 つの値 (左上の位置) と同じコードを取得し、いくつかの変数 (および)からわかっている画像の幅と高さを追加することにより、それらを手動で計算する必要があります。したがって、タプルの 2 番目の 2 つの値は 1 番目と 2 番目の値と同じですが、マスクのまたは高さ( ) が追加されています。img2_wimg2_himg2

それが十分に理にかなっていることを願っています。あなたのプロジェクトで頑張ってください!

于 2013-10-11T08:33:09.077 に答える