大家還記得之前k-means 是一種不需要給Label的分類方法嗎?
今天會介紹除了像鳶尾花分類之外,也可以用於分類影像,今天要介紹如何做訓練並且介紹如何解釋分類成果。
從先前的Code中,將影像每一個像素擷取出RGB三個元素值,轉換成R,G,B三維度陣列,接著將送入K-means函式做分類:
K-means函式分類
$kmeans = new KMeans(3);
$result = $kmeans->cluster($kmeansRGBSample);
<?php
//執行時間上限的部份單位是秒,如果要設為無上限可以設定0
set_time_limit(0);
require_once __DIR__ . '/vendor/autoload.php';
use Phpml\Clustering\KMeans;
$source_file = "test_image.jpg";
$im = ImageCreateFromJpeg($source_file);
$imgw = imagesx($im);
$imgh = imagesy($im);
$newFilename = md5(date("YmdHis")).".jpg";
//宣告K-means RGB Sample
$kmeansRGBSample = array();
for ($i=0; $i<$imgw; $i++)
{
for ($j=0; $j<$imgh; $j++)
{
// 取得當前像素的RGB值
$rgb = ImageColorAt($im, $i, $j);
// 取得RGB的各別值
$image_R = ($rgb >> 16) & 0xFF;
$image_G = ($rgb >> 8) & 0xFF;
$image_B = $rgb & 0xFF;
$kmeansRGBSample[] = [$image_R, $image_G, $image_B];
// 印出RGB各別值
// echo "R:$image_R, G:$image_G, B:$image_B
";
}
}
$kmeans = new KMeans(3);
$result = $kmeans->cluster($kmeansRGBSample);
echo "<pre>";
print_r($result);
echo "</pre>";
// 輸出圖像到文件
// imagejpeg($im, "./images/$newFilename");
?>
可以觀察分類成果的呈現方式如下圖:
第一個維度表示分類的類別,例如分類了3類,依照順序是0 1 2,然後接下來的第二維度就是像素的編號,然後每一個像素都會顯示其RGB數值。
其實這樣的成果就是K-means的分類成果了,如果有Label就可以評估是否正確,但是難以去判讀是否正確,因此還需要將影像還原回來原本的影像,將在明日說明如何還原回來原本的影像。