Pythonで画像を角丸にトリミングすることは可能でしょうか?
海外サイトなどを調べてもそれらしい情報が出てきませんでした。
また、角丸にする際は正方形でなく長方形の画像でも同じ比率の角丸であることです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/30 14:35
回答2件
0
マスクを作れれば後はそれを画像に適用してやればクリッピングができると思います。
マスクの作り方ですが・・・OpenCvを何もしらない初心者がPythonのみ(Pythonの機能もよくわかっていない)で強引に書いてみた例が以下のようなものです。
python
1import numpy as np 2 3def fill_circle(m, fill_value, cx, cy, r): 4 [w, h] = m.shape 5 r2 = r * r 6 for y in range(h): 7 for x in range(w): 8 dx = cx - x 9 dy = cy - y 10 if (dx * dx + dy * dy) <= r2: 11 m[y][x] = fill_value 12 13def fill_round_rect(m, fill_value, x0, y0, w, h, r): 14 fill_circle(m, fill_value, x0 + r, y0 + r, r) 15 fill_circle(m, fill_value, x0 + w - r - 1, y0 + r, r) 16 fill_circle(m, fill_value, x0 + r, y0 + h - r - 1, r) 17 fill_circle(m, fill_value, x0 + w - r - 1, y0 + h - r - 1, r) 18 m[y0 : y0 + h, x0 + r : x0 + w - r] = fill_value 19 m[y0 + r : y0 + h - r, x0 : x0 + w] = fill_value 20 21 22mask1 = np.zeros([20, 20], dtype='uint8') 23fill_round_rect(mask1, 1, 2, 2, 16, 16, 4) 24print(mask1) 25===> 26[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 27 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 28 [0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0] 29 [0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0] 30 [0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0] 31 [0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0] 32 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 33 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 34 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 35 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 36 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 37 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 38 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 39 [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0] 40 [0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0] 41 [0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0] 42 [0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0] 43 [0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0] 44 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 45 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
リファレンスに一通り目を通し、どんな機能があるか調べればきっとなにか便利な関数を呼び出すだけでこんなコードを書く必要がないことを後から知ることになるでしょう。
しかしながら、わからないうちはしかたありません。スマートな方法でなくてもよいから、なんとかして実装してみるのが大事と思います。そうこうしているうちにPythonにもOpenCVにもだんだん慣れてゆくのではないでしょうか?
投稿2017/10/30 14:07
総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/30 14:43
2017/10/30 15:07
退会済みユーザー
2017/10/30 21:45
2017/10/31 00:10
2017/10/31 06:24
0
自己解決
色々探し回り、ようやくそれらしい動きを見つけました。
下記にコードを書いときます。
Pillowのインストールが必要です。
python
1from PIL import Image, ImageDraw 2 3#実行内容本体 4def add_corners(im, rad): 5 circle = Image.new('L', (rad * 2, rad * 2), 0) 6 draw = ImageDraw.Draw(circle) 7 draw.ellipse((0, 0, rad * 2, rad * 2), fill=255) 8 alpha = Image.new('L', im.size, 255) 9 w, h = im.size 10 alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0)) 11 alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad)) 12 alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0)) 13 alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad)) 14 im.putalpha(alpha) 15 return im 16 17im = Image.open('main.jpg')#画像をセット 18im = add_corners(im, 100)#Rounded化メソッドを引数と共に実行 19im.save('main.png')#実行後 20
回答していただいた方へありがとうございます。
投稿2017/10/31 09:57
総合スコア27
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。