イメージの主要な色を抽出する必要があるアプリケーションを作成しようとしています。だから私は、主要な色を識別するために使用されるいくつかの機能を持つクラスを作った(ヒストグラムの生成、画像の平坦化、色のクラスターの作成など)。これらの機能は互いに無関係ですが、一緒に機能しています。しかし、私はどのように実際にクラスを設計するか分からない。今は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
なぜオブジェクトに状態を保存したくないのですか? – BrenBarn
正直なところ、このシナリオでは救われる必要のあることは考えられません。正直なところ、私は色の詳細を取得した後、画像の情報を使用する必要はありません。そして、ロードされたイメージを変更する(setimageを使用する)か、新しいインスタンスを作るのは単なるオーバーヘッドです(メモリのオーバーヘッドで、イメージはまだメモリにロードされません)。ジューサー。私は果物を入れてジュースを買うことができます。しばらくしてから、私は別の果実を入れてジュースを手に入れます。それ自体に何も保存されていません。たぶんパルプスローxD –
あなたの質問は何か分かりません。あなたのクラス**が** mantain状態になっているという事実は助けにはなりません。 – Goyo