質問するログイン新規登録
Python 3.x

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

Q&A

1回答

11121閲覧

Pythonでラベリングし、色付けする方法

TSonoda

総合スコア8

Python 3.x

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

0グッド

0クリップ

投稿2016/09/05 08:12

0

0

###前提・実現したいこと
pythonで二値画像のラベリングを行い、一番面積の大きいラベル以外を黒く塗りつぶしたいのですが、方法が分からず困っています。
画像の真ん中の白い部分だけを残したいです。
よろしくお願いします。
現状の画像
###発生している問題・エラーメッセージ

ラベル付けは出来たのですが、そこから面積の小さいものを塗ることが出来ません。

###該当のソースコード

Python3.4.3

1from PIL import Image 2import numpy as np 3from matplotlib import pylab as plt 4import sys 5import cv2 6from PIL import ImageOps 7 8 9param = sys.argv 10kernel = np.ones((5,5),np.uint8) 11 12src = np.array(Image.open("%s.jpg"%param[1]).convert("L")) 13ret,ans_d = cv2.threshold(src,105, 255, cv2.THRESH_BINARY) 14ans_d[900:1071,800:1071]=0 15dst = cv2.morphologyEx(ans_d, cv2.MORPH_OPEN, kernel) 16#dst = cv2.morphologyEx(dst, cv2.MORPH_CLOSE, kernel) 17label = cv2.connectedComponentsWithStats(dst) 18n=label[0] - 1 19data = np.delete(label[2],0,0) 20center = np.delete(label[3],0,0) 21

###試したこと
dataの中身を見ると、以下のものが表示され9番目のラベルが面積が大きいことは分かるのですが…
array([[ 446, 18, 65, 25, 1078],
[ 606, 23, 30, 16, 244],
[ 339, 29, 132, 52, 2583],
[ 650, 29, 47, 39, 1088],
[ 611, 33, 52, 24, 660],
[ 711, 46, 20, 29, 380],
[ 288, 57, 61, 50, 1246],
[ 733, 62, 37, 42, 1027],
[ 146, 79, 843, 720, 463271],
[ 789, 81, 220, 334, 13896],
[ 472, 84, 12, 7, 79],
[ 243, 98, 32, 30, 601],
[ 264, 126, 11, 9, 72],
[ 207, 133, 32, 34, 596],
[ 223, 144, 28, 24, 289],
[ 186, 173, 7, 7, 47],
[ 209, 173, 15, 14, 147],
[ 166, 187, 21, 24, 235],
[ 178, 195, 20, 21, 269],
[ 152, 227, 22, 26, 276],
[ 142, 258, 6, 7, 40],
[ 871, 715, 43, 55, 663],
[ 252, 717, 121, 69, 1722],
[ 780, 771, 100, 86, 1566]], dtype=int32)

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

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

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

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

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

guest

回答1

0

遅レスですが、PythonとOpenCVの勉強がてら解いてみました。
(python風の書き方になっていないかもしれません)

Python

1# -*- coding: utf-8 -*- 2 3from PIL import Image 4import numpy as np 5import sys 6import cv2 7 8param = sys.argv 9kernel = np.ones((5, 5), np.uint8) 10 11src = np.array(Image.open("%s.jpg"%param[1]).convert("L")) 12height, width = src.shape[:2] 13 14ret, src = cv2.threshold(src, 105, 255, cv2.THRESH_BINARY) 15label = cv2.connectedComponentsWithStats(cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)) 16 17# 2次元ままだと何かと処理しづらいので1次元に落とす 18dst = label[1].reshape((-1)) 19 20# 背景を除いて1番大きいラベルのみを白にし、その他を黒とする 21data = np.delete(label[2], 0, 0) 22max_index = np.argsort(data[:,4])[::-1][0] + 1 23for index in range(len(dst)): 24 if dst[index] == max_index: 25 dst[index] = 255; 26 else: 27 dst[index] = 0; 28 29# 2次元に戻して画像として出力 30dst = dst.reshape((height, width)) 31cv2.imwrite("result.bmp", dst)

重要なのはただ一点、「label[1]には各画素が所属するラベル値が格納されている」という点になります。
すなわち、label[1]のうち値が「9」のものだけを抜き出すことで、
「9」番目にラベル付けされた部分のみが抜き出せます。
参考になれば。

投稿2016/11/02 06:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問