awkを使って画像をぼかします

awkを使って画像をぼかします

画像をぼかしたいです。変換コマンドを使用して画像形式を.bmpからpbmに変更してから、再びbmpに変更しています。

私の考えは、画像の各ピクセルを繰り返し、現在のピクセルとローカルピクセルの平均を計算し、平均を割り当てることです。

残念ながら、画像をbmpに変換しようとするとエラーが発生します。

convert: improper image header `newFile.ppm' @ error/pnm.c/ReadPNMImage/282.
convert: no images defined `newFile.bmp' @ error/convert.c/ConvertImageCommand/3210.

私のスクリプトは次のとおりです。GNU nano 2.5.3ファイル:Blur.sh

#!/bin/sh

name=$(echo $1 | cut -d'.' -f1)
echo $name
name="$name.ppm"
echo $name
awk 'BEGIN {FS=" "}
/^.*/{
    for(i=0; i < NF -5; i++) {
        avarage=(($i + $($i+1) + $($i+2))/3)
        printf $avarage" "
        if(i > 100) {printf $i >> "newFile.ppm" }
        else {
            printf $avarage" " >> "newFile.ppm"
            printf $avarage" " >> "newFile.ppm"
            printf $avarage" " >> "newFile.ppm"
        }
    }
}' $name

ベストアンサー1

awkひどい画像処理ツールです。

正しいPPMイメージヘッダが出力ファイルに書き込まれないため、問題が発生します。また、入力ファイルのヘッダーを無視します。 PPM画像タイプがP3(ASCIIでエンコードされたRGB)、P2(ASCIIでエンコードされたグレースケール)、またはP1(ASCIIでエンコードされた白黒)タイプではない場合、通常はテキストファイルのように読み取ることはできません。バイナリファイルになります)。

このヘッダの形式については後述する。Netpbm形式に関するWikipediaの記事。記事に提示された例は次のとおりです。

P3
3 2
255
# The part above is the header
# "P3" means this is a RGB color image in ASCII
# "3 2" is the width and height of the image in pixels
# "255" is the maximum value for each color
# The part below is image data: RGB triplets
255   0   0     0 255   0     0   0 255
255 255   0   255 255 255     0   0   0

この例では行ごとに3つのピクセルがありますが、この記事の後半の例では改行は重要ではなく、ピクセルのRGB値を正規化できることを示しています。

同じ写真:

P3
# The same image with width 3 and height 2,
# using 0 or 1 per color (red, green, blue)
3 2 1
1 0 0   0 1 0   0 0 1
1 1 0   1 1 1   0 0 0

同じ写真:

P3 3 2 1  1 0 0   0 1 0   0 0 1  1 1 0   1 1 1   0 0 0

また、ループは各行の最後の3つのRGB値(または画像がグレースケールまたは白黒の場合は最後の3ピクセル)を無視します。

おすすめ記事