iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 16
0
AI & Data

學習PHP Machine Learning的冒險歷程系列 第 16

[2020鐵人賽Day16]邂逅PHP Machine Learning-K-means 圖片分類(4) - 成果還原為影像

前情提要

首先,我們要了解影像的分類成果其實還需要轉換成圖片,才能知道他分類的好不好(監督式也是),因此需要將分類成果轉換顏色,並且還原成影像。

成果轉換顏色

首先,我們要把文字重新著色,把第一類以[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");
?>

成果影像

原圖
https://ithelp.ithome.com.tw/upload/images/20191002/200913334brtp1t9aV.jpg

成果圖
https://ithelp.ithome.com.tw/upload/images/20191002/20091333YBCZFgta25.jpg

圖片來自google

完整範例Code

<?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");
?>

上一篇
[2020鐵人賽Day15]邂逅PHP Machine Learning-K-means 圖片分類(3) - 圖片分類與分布
下一篇
[2020鐵人賽Day17]邂逅PHP Machine Learning-類神經網路(NN)-簡介原理
系列文
學習PHP Machine Learning的冒險歷程30

尚未有邦友留言

立即登入留言