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

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

Q&A

解決済

1回答

1286閲覧

画像輪郭のなめらか処理の方法

suzuki

総合スコア2

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

0グッド

1クリップ

投稿2022/09/17 16:43

編集2022/09/17 16:44

前提

アクリルキーホルダーの画像を自動生成するために、
キャラクター画像などの輪郭を抽出しています。

実現したいこと

ImageMagickを使って輪郭の抽出は出来ていますが、
角が多い画像の場合鋭角に輪郭が抽出されてしまいます。

  • 輪郭の角をなめらかに丸くする
  • 抽出した輪郭の線より内側に2px小さくしたい
  • 抽出した輪郭の線より外側に2px大きくしたい

ご教授願いたい事

ImageMagickやOpenCVで出来ないか調べましたが、
私の画像加工の知見が乏しく思うような方法自体が見つからない状態です。

理想としては上記の"実現したいこと”の3点を解決方法が分かれば最高なのですが、
どのような方法があるのか方法論だけでもご教授頂けると助かります。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

あらかじめ内部が塗りつぶされた画像、あるいはfindContoursのような前処理で外接輪郭を塗りつぶした画像があれば、以下のようにmorphologyExModeFilterで輪郭をなめらかにすることができます。

Python

1import numpy as np 2import cv2 3from PIL import Image, ImageFilter 4 5# 中身が白、外側が黒に反転 6img = cv2.imread('pika.png') 7img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8img2 = 255-img2 9 10# 円形(なめらか)に膨張 11kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (40,40)) # 膨張サイズは適当に 12img2 = cv2.morphologyEx(img2, cv2.MORPH_DILATE, kernel) 13 14# モード(最頻)フィルターを適用 15img2 = Image.fromarray(img2) # cv -> PIL 16img2 = img2.filter(ImageFilter.ModeFilter(20)) 17img2 = np.array(img2, dtype=np.uint8) # PIL -> cv 18 19# 外接する輪郭を取得して内部を塗りつぶす 20contours, hierarchy = cv2.findContours(img2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 21img2 = cv2.drawContours(img, contours, -1, (0,0,0), thickness=cv2.FILLED) 22cv2.imwrite('ret.png', img2)

pika.png
イメージ説明

ret.png
イメージ説明

投稿2022/09/17 18:53

編集2022/09/18 02:10
can110

総合スコア38256

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

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

suzuki

2022/09/18 17:31

無事にできました。 本当に助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問