首先,我們要了解影像的分類成果其實還需要轉換成圖片,才能知道他分類的好不好(監督式也是),因此需要將分類成果轉換顏色,並且還原成影像。
首先,我們要把文字重新著色,把第一類以[255, 255, 255]白色顯示,第二類為[255, 0, 0]紅色顯示,第三類為[0, 0, 0]黑色顯示。Code如下:
//取得陣列key值
$resultArrayKey_0 = array_keys($result[0]);
$resultArrayKey_1 = array_keys($result[1]);
$resultArrayKey_2 = array_keys($result[2]);
for($i=0; $i<count($result[0]); $i++){
$result[0][$resultArrayKey_0[$i]] = [255, 255, 255];
}
for($i=0; $i<count($result[1]); $i++){
$result[1][$resultArrayKey_1[$i]] = [255, 0, 0];
}
for($i=0; $i<count($result[2]); $i++){
$result[2][$resultArrayKey_2[$i]] = [0, 0, 0];
}
因為分類是的陣列形狀不是我們需要的,因此要把陣列還原成影像的陣列(N,M,3)
$reductionRGB = Array();
for($i=0; $i<count($resultArrayKey_0); $i++){
$reductionRGB[$resultArrayKey_0[$i]] = $result[0][$resultArrayKey_0[$i]];
}
for($i=0; $i<count($resultArrayKey_1); $i++){
$reductionRGB[$resultArrayKey_1[$i]] = $result[1][$resultArrayKey_1[$i]];
}
for($i=0; $i<count($resultArrayKey_2); $i++){
$reductionRGB[$resultArrayKey_2[$i]] = $result[2][$resultArrayKey_2[$i]];
}
將原本的影像用Reshape之後的影像逐一對應,這樣就可以將影像還原成分類成果影像了。
$nowArrayCount = 0;
for ($i=0; $i<$imgw; $i++)
{
for ($j=0; $j<$imgh; $j++)
{
// 取得設定值
$val = imagecolorallocate($im, $reductionRGB[$nowArrayCount][0], $reductionRGB[$nowArrayCount][1], $reductionRGB[$nowArrayCount][2]);
$nowArrayCount++;
// 設定圖像值
imagesetpixel ($im, $i, $j, $val);
}
}
// 輸出圖像到文件
imagejpeg($im, "./images/$newFilename");
?>
原圖
成果圖
圖片來自google
<?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];
}
}
$kmeans = new KMeans(3);
$result = $kmeans->cluster($kmeansRGBSample);
//取得陣列key值
$resultArrayKey_0 = array_keys($result[0]);
$resultArrayKey_1 = array_keys($result[1]);
$resultArrayKey_2 = array_keys($result[2]);
for($i=0; $i<count($result[0]); $i++){
$result[0][$resultArrayKey_0[$i]] = [255, 255, 255];
}
for($i=0; $i<count($result[1]); $i++){
$result[1][$resultArrayKey_1[$i]] = [255, 0, 0];
}
for($i=0; $i<count($result[2]); $i++){
$result[2][$resultArrayKey_2[$i]] = [0, 0, 0];
}
$reductionRGB = Array();
for($i=0; $i<count($resultArrayKey_0); $i++){
$reductionRGB[$resultArrayKey_0[$i]] = $result[0][$resultArrayKey_0[$i]];
}
for($i=0; $i<count($resultArrayKey_1); $i++){
$reductionRGB[$resultArrayKey_1[$i]] = $result[1][$resultArrayKey_1[$i]];
}
for($i=0; $i<count($resultArrayKey_2); $i++){
$reductionRGB[$resultArrayKey_2[$i]] = $result[2][$resultArrayKey_2[$i]];
}
$nowArrayCount = 0;
for ($i=0; $i<$imgw; $i++)
{
for ($j=0; $j<$imgh; $j++)
{
// 取得設定值
$val = imagecolorallocate($im, $reductionRGB[$nowArrayCount][0], $reductionRGB[$nowArrayCount][1], $reductionRGB[$nowArrayCount][2]);
$nowArrayCount++;
// 設定圖像值
imagesetpixel ($im, $i, $j, $val);
}
}
// 輸出圖像到文件
imagejpeg($im, "./images/$newFilename");
?>