2016-03-27 26 views
-1

イメージの主要な色を抽出する必要があるアプリケーションを作成しようとしています。だから私は、主要な色を識別するために使用されるいくつかの機能を持つクラスを作った(ヒストグラムの生成、画像の平坦化、色のクラスターの作成など)。これらの機能は互いに無関係ですが、一緒に機能しています。しかし、私はどのように実際にクラスを設計するか分からない。今はConstructor/SetImage関数の入力パラメータとして画像(または画像へのパス)を取ります。しかし、私はこのイメージをクラスの状態に付けることは役に立たないと考えました。基本的な機能は、画像をフィードして何かを得ることです。私は単なる関数を書いたほうがいいかもしれないと感じましたが、他の関数を何らかの主な使用関数と接続したいと思います。私は静的なものとしてすべてを書くべきかもしれないと思ったが、それが正しい方法であればわからない。状態を維持する必要のないクラスを設計する

このケースがデザインパターンに該当するかどうかはわかりません(これは私が読んだか、またはこれを理解する方法とは思われませんでした)。最高のコンベンションが何であるかはっきりしない

私がしたいことは、クラスを初期化し、関数を呼び出して結果を取得することです。私は確かに単純なことを書くことができ、明示的に引数を渡すことができます。しかし、私はベストプラクティスとコンベンションを知ることを忘れないようにしたいと思っています。 私は現在Pythonでコードを書いていますが、Pythonの中心的な解決策を望んでいません。(コールメソッドなどを実装して何かをするなど)

私は今すぐコードを持っています。

class colorIdentifier(object): 
    def __init__(self,**kwargs): 
     self.img = None 
     self.hist = None 

    def setImg(self, img): 
     if(type(img) is str): 
      self.img = cv2.imread(img) 
      self.img = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB) 
     else: 
      self.img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

     h, w, _ = self.img.shape 
     w_new = int(100 * w/max(w, h)) 
     h_new = int(100 * h/max(w, h)) 

     self.img = cv2.resize(self.img, (w_new, h_new)) 

    def flatten(self,img): 
     image_array = self.img.reshape((self.img.shape[0] * self.img.shape[1], 3)) 
     # Clusters the pixels 
     self.clt = KMeans(n_clusters = 3) 
     self.clt.fit(image_array) 


    def getClusters(self): 
     clt = self.clt 
     # Finds how many pixels are in each cluster 
     self.hist = self.__centroid_histogram(clt) 

     # Sort the clusters according to how many pixel they have 
     zipped = zip (self.hist, clt.cluster_centers_) 
     zipped.sort(reverse=True, key=lambda x : x[0]) 
     self.hist, clt.cluster_centers = zip(*zipped) 

    def __centroid_histogram__(self,clt): 
     # grab the number of different clusters and create a histogram 
     # based on the number of pixels assigned to each cluster 
     numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1) 
     (hist, _) = np.histogram(clt.labels_, bins = numLabels) 

     # normalize the histogram, such that it sums to one 
     hist = hist.astype("float") 
     hist /= hist.sum() 

     # return the histogram 
     return hist 

EDIT 1:なぜ私は正直に言うとどのような状態に

を保存したいとは思わないでしょう

に疑問を

回答、私は何も考えることができませんこのシナリオでは保存する必要があります。正直なところ、私は色の詳細を取得した後、画像の情報を使用する必要はありません。そして、ロードされたイメージを変更する(setimageを使用する)か、新しいインスタンスを作るのは単なるオーバーヘッドです(メモリのオーバーヘッドで、イメージはまだメモリにロードされません)。ジューサー。私は果物を入れてジュースを買うことができます。しばらくしてから、私は別の果実を入れてジュースを手に入れます。それ自体に何も保存されていません。たぶんパルプですがxD

+0

なぜオブジェクトに状態を保存したくないのですか? – BrenBarn

+0

正直なところ、このシナリオでは救われる必要のあることは考えられません。正直なところ、私は色の詳細を取得した後、画像の情報を使用する必要はありません。そして、ロードされたイメージを変更する(setimageを使用する)か、新しいインスタンスを作るのは単なるオーバーヘッドです(メモリのオーバーヘッドで、イメージはまだメモリにロードされません)。ジューサー。私は果物を入れてジュースを買うことができます。しばらくしてから、私は別の果実を入れてジュースを手に入れます。それ自体に何も保存されていません。たぶんパルプスローxD –

+0

あなたの質問は何か分かりません。あなたのクラス**が** mantain状態になっているという事実は助けにはなりません。 – Goyo

答えて

0

pure function入力が画像で出力がカラーの詳細であるように思えます。静的メソッドまたはColorDetailsオブジェクトのコンストラクタとして実装できます。後者はよりオブジェクト指向のアプローチになります。ColorDetailsのさまざまなタイプを実装する柔軟性を望むなら、デザインパターンの点では、Factory Methodまたは静的ファクトリメソッドを作ることができます。

関連する問題