PythonはOpenCVとK-Meansクラスターを使って卒業写真を画像分割します。


画像分割は、画像を複数の異なる領域(またはセグメント)に分割するプロセスである。目標は、画像の表現をより容易でより有意義な画像にすることである。
このブログでは、K-Means Custeringという画像分割方法を見ます。
K-Meansクラスターは、N個の観測値をK個のクラスターに分類することを目的とする無監視マシン学習アルゴリズムであり、それぞれの観測値は最も平均的なクラスターに属する。クラスタとは、いくつかの類似性のためにまとめられたデータポイントの集合を意味する。画像分割については、ここのクラスタは異なる画像色である。
私達が使っている環境はpip install opencv-python numpy matplotlibです。
選択した写真は私達の学校の卒業写真です。安心してください。ここには私がいません。

必要なモジュールをインポート:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# read the image
image = cv2.imread("Graduation.jpg")
画像を分割する前に、画像をRGB形式に変換します。

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
私たちはcv 2.kmeans関数を使用して、1つの2 D配列を入力とし、私たちのオリジナル画像は3 D(幅、高さ、深さは3つのRGB値)なので、高度と幅を単一のピクセルベクトル(3つのRGB値)にする必要があります。

#          3    (RGB) 2D  
print(image.shape) #(853, 1280, 3)
pixel_values = image.reshape((-1, 3))
#    numpy float32
pixel_values = np.float32(pixel_values)
print(pixel_values.shape) #(1091840, 3)
opencvのkmeanアルゴリズムについては、関数はcv2.kmeans()です。
関数のフォーマットはkmeans(data, K, bestLabels, criteria, attempts, flags)です。
data:データを分類して、np.float 32のデータが一番いいです。特徴ごとに一列に並べます。np.float 32の原因はこのタイプの演算速度が速いため、uint型のデータなら遅いです。
K:分類数、opencv 2のkmeans分類は既知の分類数が必要です。
ベストLabels:デフォルトの分類ラベル:ないとNone
criteria:反復停止のモード選択、これは3つの要素を含むタプル型の数です。フォーマットは(type,max_iter,epsilon)max_iterの反復回数、epsilonの結果の正確さです。
この中で、typeはまた3つの選択があります。
  • cv 2.TERM_CRITERIA_EPS:精度(誤差)は、epsilon停止を満たす。
  • cv 2.TERM_CRITERIA_MAX_ITER:反復回数がmax_を超えるiter停止
  • cv 2.TERM_CRITERIA_EPS+cv 2.TERM_CRITERIA_MAX_ITERは、両者が合体し、いずれかの満足が終わる。
  • -atempts:繰り返し試験kmeansアルゴリズムの回数は、最高の結果
  • に戻ります。
    flags:初期クラスセンター選択、2つの方法cv2.KMEANS_PP_CENTERSアルゴリズムkmeans++のセンター。cv2.KMEANS_RANDOM_CENTERSランダム初期化
    ここでは、停止基準を決定するためにcriteriaを設定する必要があります。いくつかの反復回数(例えば500)を超えるときに停止します。または、クラスタ移動があるepsilon値より小さい場合(ここで0.1を選択します。)、以下のコードはOpenCVでこの停止基準を定義します。
    
    #       
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 500, 0.1)
    
    上の画像は5つの主要な色(それぞれ空、芝生、木、人の上半身が白く、人の下が黒い)を発見します。
    したがって、私たちはこの写真のためにK=5を使います。
    
    k = 5
    _, labels, (centers) = cv2.kmeans(pixel_values, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    
    cv 2.KMEANS_RANDOMCENTERSはOpenCVが最初にクラスタをランダムに割り当てた値だけを示す。
    平たい画像の画素値を浮動小数点32タイプに変換したのは、cv 2.kmeans()浮動小数点32タイプのためであり、その後、浮動小数点を8ビットの画素値np.uint8(centers)に変換する。
    
    #    np.uint8
    centers = np.uint8(centers)
    
    #       
    labels = labels.flatten()
    
    segmented_image = centers[labels.flatten()]
    
    元の画像の形に変換して表示します。
    
    #         
    segmented_image = segmented_image.reshape(image.shape)
    plt.imshow(segmented_image)
    plt.show()
    

    もちろん、画像中のK-Meansクラスターの一部を無効にすることもできます。例えば、クラスタ番号1を無効にして画像を表示させます。
    
    #   2   (       )
    masked_image = np.copy(segmented_image)
    #            
    masked_image = masked_image.reshape((-1, 3))
    cluster1 = 1
    masked_image[labels == cluster1] = [0, 0, 0]
    #        
    masked_image = masked_image.reshape(image.shape)
    plt.imshow(masked_image)
    plt.show()
    
    在这里插入图片描述
    K-Meansクラスター2番は木だった。
    ホーフ変換、輪郭検出、および現在の最先端の意味分割などの他の分割技術があることに注意してください。
    ここでPythonについてはOpenCVとK-Meansのクラスターを使って卒業写真を画像分割した文章を紹介します。これに関連してOpenCVとK-Meansの画像分割の内容は以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。