ランダムノイズ画像を生成(bash,zsh)

 単純な白黒画像だけ生成していても面白くありません。今度はランダムノイズ画像を生成してみましょう。
 bash,zshで乱数を得るには$RANDOMを参照します。以下のようにすると0〜32767までの値が表示されます。

echo $RANDOM

ただ、今回は白黒画像なので欲しい値は0か1です。このような場合は剰余(割り算のあまり)を求める%を使います。以下のようにすると0か1しか表示されなくなります。

echo $(($RANDOM % 2))

1回だけでは分からないという人は以下のようにコマンドを入力してみましょう。100個の乱数が表示されます。

for i in {1..100};do echo $(($RANDOM % 2));done

改行されるとわからないと言う場合はnオプションを付ければOKです。

for i in {1..100};do echo -n $(($RANDOM % 2));done

ここまでできれば後は簡単です。以下のようにすると256×256サイズの白黒ノイズ画像が生成されます。

echo 'P1'>noise.pbm
echo '256 256'>> noise.pbm
for i in {1..65536};do echo -n "$(($RANDOM % 2)) ";done>> noise.pbm

今度はechoの後の文字列はシングルクオートでなくダブルクオートで囲んでいます。ダブルクオートで囲むと文字列内に書かれている変数が評価され、その結果が反映されるようになります。以下のように入力して実行結果を比較してみるとわかるでしょう。

echo '$RANDOM'

echo "$RANDOM"

ランダムノイズ画像を生成(Mac版PowerShell)

 PowerShellでも乱数(整数値または小数値)を得ることができます。PowerShellの場合はGet-Randomを使います。以下のようにすると0〜2147483647までの乱数値が表示されます。(Windows 10での実行画面も入れてありますが参考までに)

Get-Random

Get-Randomはオプションで最小値、最大値を指定できます。最小値のオプションはMinimumで、指定しない場合は0になります。最大値はMaximumですが、指定した値よりも最小値から1少ない値までの乱数値になります。つまり、以下のように指定すると0〜9までの乱数値を得ることができます。

Get-Random -Minimum 0 -Maximum 10

今回生成する白黒画像の場合は0か1の乱数値なので以下のように指定します。

Get-Random -Maximum 2

PowerShellのGet-Randomは強力&高機能です(便利です)。興味ある方は以下のマイクロソフトのGet-Randomのリファレンスページを参照してみてください。

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-random?view=powershell-7.1

PowerShellで100個の乱数値を表示する場合は以下のようになります。

1..100|%{ Get-Random -Maximum 2 }

改行したくない場合は以下のようにWrite-HostでNoNewLineのオプションを指定します。ただし、Write-Hostを使うとパイプ、リダイレクト機能が使えません。単に画面に出力するだけです。実際のところ、今回のような用途には使えません。出力される内容の確認用としては使えます。

1..100|%{ Get-Random -Maximum 2 | Write-Host -NoNewLine }

PowerShellだとfor,foreachを使って書くこともできます。

for($i=0; $i -lt 100; $i++){ Get-Random -Maximum 2 | Write-Host -NoNewLine }
foreach($i in 1..100){ Get-Random -Maximum 2 | Write-Host -NoNewLine }

さて、ここまでできればあとは簡単です。以下のようにすれば256×256サイズの白黒ノイズ画像が生成されます。ただし、Windows PowerShellで実行すると改行コードの違いで正しい画像形式になりません。改行コードのCR+LFをLFに置換する必要があります。改行コードの変換方法は検索するといろいろ出てきますので、好みのものを使って変換してみてください。

echo 'P1'>noise.pbm
echo '256 256'>> noise.pbm
1..65536|%{ Get-Random -Maximum 2 }>> noise.pbm

長くなったので今回はここまで。次回はPGM,PPMです。テキストからグレースケール画像、フルカラー画像を生成してみます。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。