iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 13
0
AI & Data

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

[2020鐵人賽Day13]邂逅PHP Machine Learning-K-means 圖片分類(1) - 載入圖片取得RGB與儲存圖片

前置作業

今天要來提一下,PHP載入圖片取得RGB與儲存圖片的操作方式
首先,我們可以到這挑選一張自己喜歡的免費無版權的圖片
Pexels

接著,將圖片載入,取得圖片的各位置的RGB
那該怎使用呢,接下來將緩緩跟各位說明

Code詳細解說

Step1. 使用imagecreatefromjpeg函數
imagecreatefromjpeg:由文件或 URL 創建一個新圖像

imagecreatefromjpeg($filename)

$filename:圖像檔案來源
(這邊我們將挑選下載後的圖片命名為test_image.jpg)

$source_file = "test_image.jpg";
$im = ImageCreateFromJpeg($source_file);

Step2. 取得此圖像的高度與寬度
使用imagesx與imagesy函數

imagesx($image)

imagesx:取得圖像寬度函數

imagesy($image)

imagesy:取得圖像高度函數

$image:圖像資源

$imgw = imagesx($im);
$imgh = imagesy($im);

Step3. 建立將儲存檔案的檔案名稱,這邊使用當下日期時間的md5編碼

$newFilename = md5(date("YmdHis")).".jpg";

Step4. 接著取得當前像素的RGB值,並分別取得出RGB各別值

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;
        
        // 印出RGB值
        echo "R:$image_R, G:$image_G, B:$image_B<br>";
    }
}

再來,將實作把修改過RGB的值轉存為圖片

Step5. 取得將設定的灰階值( 平均值法:Gray = (R+G+B)/3 )

// 取得將設定的灰階值(平均值法:Gray = (R+G+B)/3)
$gray = round(($image_R + $image_G + $image_B) / 3);

Step6. 使用imagecolorallocate函數,給影像給予指定顏色
imagecolorallocate:指定圖片一個顏色,由给定的 RGB 组成

imagecolorallocate ( $image , int $red , int $green , int $blue )

$image:圖像資源
$red:R紅色的數值
$green:G綠色的數值
$blue:B藍色的數值

// 灰階影像特性r=g,b=g(灰階影像 R=G=B)
$val = imagecolorallocate($im, $gray, $gray, $gray);

Step7. 設定灰階值
imagesetpixel設置單個像素

imagesetpixel($image , $x , $y , $color)

$image:圖像資源
$x:x座標
$y:y座標
$color:所指定的顏色值

// 設定灰階值
imagesetpixel ($im, $i, $j, $val);

Step8. 使用imagejpeg函數,將圖像輸出儲存
imagejpeg:輸出圖像到瀏覽器或文件

imagejpeg ( $image, $to )

$image:圖像資源
$to:將要保存圖像的路徑

// 輸出圖像到文件
imagejpeg($im, "./images/$newFilename");

完整Code代碼

<?php
    $source_file = "test_image.jpg";
    $im = ImageCreateFromJpeg($source_file);

    $imgw = imagesx($im);
    $imgh = imagesy($im);

    $newFilename = md5(date("YmdHis")).".jpg";
    // echo $imgw.",".$imgh."<br>";

    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;

            // 印出RGB各別值
            echo "R:$image_R, G:$image_G, B:$image_B <br>";

            // 取得將設定的灰階值(平均值法:Gray = (R+G+B)/3)
            $gray = round(($image_R + $image_G + $image_B) / 3);
            
            // 灰階影像特性r=g,b=g(灰階影像 R=G=B)
            $val = imagecolorallocate($im, $gray, $gray, $gray);

            // 設定灰階值
            imagesetpixel ($im, $i, $j, $val);
        }
    }

    // 輸出圖像到文件
    imagejpeg($im, "./images/$newFilename");
?>

參考來源:
PHP imagecreatefromjpeg
PHP imagesx
PHP imagesy
灰度值
PHP imagecolorallocate
PHP imagesetpixel
PHP imagejpeg


上一篇
[2020鐵人賽Day12]邂逅PHP Machine Learning-K-means 鳶尾花分類
下一篇
[2020鐵人賽Day14]邂逅PHP Machine Learning-K-means 圖片分類(2) - 圖片轉樣本
系列文
學習PHP Machine Learning的冒險歷程30

尚未有邦友留言

立即登入留言