2

色と形の異なるイメージがあります。私はkmeansをクラスタリングしてから、2つの異なる画像を提供する必要があります。一つは形状が再生され、もう一つはLetterの色が再生されたものです。 ここにサンプルの元画像と私が達成する必要があるものがあります。 Original ImageKmeans、Opencv Pythonを使用したカラーセグメンテーション

Shape color regenerated と同様に、単に白R.

と他1私は望ましい結果を再生成するラベルとクラスタIDXにアクセスするにはどうすればよい、クラスタリングアルゴリズム関数kmeansを正常に実行していますか?誰かがサンプルコードで説明することができますか?ここにコードがあります。前もって感謝します。

import numpy as np 
import cv2 

img = cv2.imread("/home/manohar/Outputs/Targets/m-0.PNG",1) 
cv2.imshow("original",img) 

Z = img.reshape((-1,3)) 

# convert to np.float32 
Z = np.float32(Z) 

# Here we are applying k-means clustering so that the pixels around a colour are consistent and gave same BGR/HSV values 


# define criteria, number of clusters(K) and apply kmeans() 
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) 
# We are going to cluster with k = 2, because the image will have just two colours ,a white background and the colour of the patch 
K = 3 
attempts=10 
ret,label,center=cv2.kmeans(Z,K,None,criteria,attempts,cv2.KMEANS_PP_CENTERS) 

# Now convert back into uint8 
#now we have to access the labels to regenerate the clustered image 
center = np.uint8(center) 
res = center[label.flatten()] 
res2 = res.reshape((img.shape)) 
#res2 is the result of the frame which has undergone k-means clustering 


cv2.imshow("res2",res2) 
cv2.waitKey() 
cv2.destroyAllWindows() 

答えて

1

オクラホマので、あなたが最初に「白」のカテゴリに対応するラベルを確認する必要がありK-Meansで「白」に分類されたすべてのピクセルの黒に変更したい場合。あなたはこのように、白色(255,255,255)が属するん(結果のk個のセンターを含む)centerにどのような指標に目を向けることによって、これを達成することができます:

white_index = 0 
for b,g,r in center: 
    #check if it is white 
    if b == g == r == 255: 
     #then this is the white category 
     break 
    white_index = white_index + 1 

k-meansとしてはunsupervized方法あなたの範疇であることに注意してください。必ずしも正確に白である必要はありません(250,249,254のようなものかもしれません)。だから、インデックスを検索するときにこれを考慮する必要があります。すなわち、に近い色を探すべきです。に近いものです。あなたはcolor distanceの式を適用して色を比較することでこれを達成できます。

しかし、私の経験では、私はcenterはすでに(大きいピクセル値が最初に出現する傾向がある)何らかの方法で結果センターをソートし、私は近い白にセンターを気づいていると信じているが(下のインデックスを持っているので、白かもしれインデックス0)。しかし、確かに確認する方がいいです。

どのようなインデックスが白色に対応しているのか分かりましたので、どのピクセルが変数に分類されているのか分かります。このために、あなたがそれを行うと、確かにいくつかの他のものよりも効率的な可能性があり、いくつかの方法があり、1つのアプローチは次のようになります。

#Copy image to modify it 
img_copy = img[:] 
#Reshape label to match the original image 
new_label = label.reshape(img.shape) 
#iterate over new_label, and if the category is white 
#paint pixel corresponding to row,col black 
row = 0 
for i in new_label: 
    column = 0 
    for category in i: 
     if category == white_index: 
      #paint that pixel black 
      img_copy[row,column] = [0, 0, 0] 
     column = column + 1 
    row = row + 1 

#now show edited image 
cv2.imshow("Object Removed",img_copy) 
cv2.waitKey() 
cv2.destroyAllWindows() 

編集:上記のコードは、検出された色削除(ブラックアウト)で画像を取得します。その補完を得るためには、それは検出されたオブジェクトだけが見える画像です。あなたができることがいくつかあります。のみ抽出されたオブジェクトを得る別のより複雑な方法を得ることである

#Obtain another copy of image to modify it 
extract = img[:] 
#Now do the opposite, iterate over new_label, and if the category is Not white 
#paint pixel corresponding to row,col black 
row = 0 
for i in new_label: 
    column = 0 
    for category in i: 
     if category != white_index: 
      #paint that pixel black 
      extract[row,column] = [0, 0, 0] 
     column = column + 1 
    row = row + 1 

#show or do whatever you want... 

:のような一つのアプローチは、(category == white_indexなし)その色のない画素外imgと黒のコピーを入手することができ(cv2.findContours()を閾値処理して使用して)cv2.boundingRect()を適用して、オブジェクトで小さいクリップを取得できるようにします(指定された長方形でimgをクリッピングすることによって)。あなたはそれが詳細に説明されているリンクを確認することができます。

+0

あなたの返信いただきありがとうございますが、これは私が達成したかったものではありません。シェイプと文字で画像を渡すときは、シェイプのみの場合と文字カラーの場合の2つの新しい画像を再生成したいと考えています。どのように私はこの卿をやるのですか? C++では、cluster_idxを使用します。これはPythonでどのように行うのですか? – Manohar

+0

センターとラベルにアクセスする方法も質問されました。あなたはそれで何を意味するかを明確にしていただけますか?私が正しく理解していれば、検出されたオブジェクトが取り除かれた画像(形状を黒くすることで私の答えで既に説明したもの)*と*抽出されたオブジェクト(文字)のみを持つ画像も欲しいですか? – DarkCygnus

+0

あなたのコメントに基づいて私の答えを編集しました – DarkCygnus

関連する問題