💻

Octave Programming Note

2024/01/07に公開

Octave Programming Note

画像ファイルを読みだして表示する

clear;
clf();
 
# read image
X = imread("cat3.png");
 
# display image
subplot(2, 2, 1);
imshow(X);
 
# grayscale
monotone = X(:,:,1)/3 + X(:,:,2)/3 + X(:,:,3)/3;
subplot(2, 2, 2);
imshow(monotone);
 
# do FFT
Y = fft2(X);
subplot(2, 2, 3);
imshow(abs(fftshift(Y)/10000));
 
# crop
Z = X(50:200, 50:200, :);
subplot(2, 2, 4);
imshow(Z);

RAW画像データを読む

xsize = 512;
ysize = 512;
  
[fid, msg] = fopen("./image.raw", "r");
if (fid == -1)
    disp("Error: fopen");
endif
[D, count] = fread(fid, [xsize ysize], "int16=>int16");
fclose(fid);

RAWデータを読み込む

ピクセルが充填されたファイルを読み込む。
ピクセルは16ビット符号付整数で、512x512のマトリクスサイズとする。

xsize = 512;
ysize = 512;
 
[fid, msg] = fopen("image.raw", "r");
if (fid != -1)
    [I, count] = fread(fid, [xsize ysize], "int16=>int16", 0, "ieee-be");
    fclose(fid);
else
    disp("Error: fopen");
endif

16ビット符号付き整数にてLUTを作成する

64k個作るのメモリ量を喰うので、とりあえず8k個分だけ作る。
領域を超えないように呼び出し側でwl/wwを調整する必要がある。

function lut = LUT(wl, ww)
    # LUT領域確保
    lut = zeros(8192, 1);
     
    # オフセット
    offset = 4096;
     
    # LUTの開始/終了
    _lower = floor(wl - ((ww+0.0)/2.0)) + offset;
    _upper = _lower + ww;
     
    # LUT充填
    for i = (1:_lower-1)
        lut(i) = 0.0;
    endfor
     
    slope  1.0/(ww+0.0);
    for i = (_lower:_upper)
        y = slope * ((i - _lower) + 0.0);
        if (y > 1.0)
            y = 1.0
        endif
        lut(i) = y;
    endfor
     
    for i = (_upper+1:8192)
        lut(i) = 1.0
    endif
     
endfunction

LUTを通過させ輝度画像を生成する

I = zeros(ysize, xsize, 3);
for y = (1:ysize)
    for x = (1:xsize)
        ivalue = lut(I(y, x) + 4096);
        I(y, x, 1) = ivalue;
        I(y, x, 2) = ivalue;
        I(y, x, 3) = ivalue;
    endfor
endfor

Discussion