質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3041閲覧

Pythonで画像を角丸にトリミングしたい

Equestria

総合スコア27

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/30 12:21

Pythonで画像を角丸にトリミングすることは可能でしょうか?
海外サイトなどを調べてもそれらしい情報が出てきませんでした。

また、角丸にする際は正方形でなく長方形の画像でも同じ比率の角丸であることです。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/30 12:52

OpenCV マスク Pythonと探すとそれっぽいのが出てくると思います。マスク画像の特定の画像に丸を4つ描画すればよいですね。どこまでやてどこがどうできないか書くと、皆様から有用な回答が得られると思います。
Equestria

2017/10/30 14:35

ありがとうございます なるべく工夫して実装してみます
guest

回答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

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Equestria

2017/10/30 14:43

いつも回答していただいてありがとうございます Kivy等でも教えてもらっています 私も調べた結果pillowもしくはopencvどちらかで実装しようとは考えいます。 pillowですと、かなり軽量なライブラリがあるようなので。 それにコードまで書いていただいて、このようなコードの書き方があるのかと驚いています。 素晴らしい創意工夫を見せていただき、ありがとうございます。
KSwordOfHaste

2017/10/30 15:07

思いついたままヘンテコな関数をコメントしてしまい、少々はずかしいですが・・・ Python Imaging Libraryというのを使うと上で書いたような円や四角形を塗りつぶすことができるようなので、そういうものでマスクを作るのも素朴な方法かと思います。pillowちょっと見てみましたが、画像処理が本職のライブラリーのようなので、単色で単純図形を塗りつぶすといった機能はなさそうにも見えました。実際はどうなのでしょうね。
KSwordOfHaste

2017/10/31 00:10

やっと頭のなかが繋がりました。Python Imaging Library=PILでこのリポジトリをフォークしてPillowとなったからPIL/Pillowっていうんですね。なるほど...
Equestria

2017/10/31 06:24

コメントありがとうございます! 早速使ってみます。
guest

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

Equestria

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問