0

手動でノイズを追加したいグレースケール画像があります。まず、ピクセルをランダムに選択し、0 から 1 までのランダムな値を生成し、値を 255 倍して、ピクセルの前の値を新しく取得した数値に置き換え、プロセスを 100 回繰り返します。

ほとんどのコードがダウンしていると思います

    clc;
fid = fopen(str);
myimage = fread(fid, [512 683]);
fclose(fid);


for i = 1:100
A(i) = rand(1) * 255;
end

画像から 100 ピクセルをランダムに選択する方法と、それらを作成した値に置き換える方法がわかりません。支援は素晴らしいでしょう、ありがとう。

4

3 に答える 3

2

100 個のランダムなピクセルのインデックスを見つける必要があります。

rPix = floor(rand(1,100) * numel(myimage)) + 1;
rVal = rand(1,100);
myimage(rPix) = 255 * rVal;

説明

rand(1,100)  : an array of 1 x 100 random numbers
numel(myimage) : number of pixels
product of the two : a random number between 0 and n
floor() : the next smallest integer. This "almost" points to 100 random pixels; we're off by 1, so
+ 1 : we add one to get a valid index.

これで、有効なランダム インデックスが作成されました。Matlab では、配列内の要素数よりも大きい数を使用しない限り、2D 配列に 1D インデックスを使用することが有効であることに注意してください。したがって、

A = rand(3,3);
b = A(5);

と同じです

b = A(2,2); % because the order is A(1,1), A(2,1), A(3,1), A(1,2), A(2,2), ...

次の行:

rVal = rand(1, 100);

100 個の乱数 (0 から 1 の間) を生成します。最終行

myimage(rPix) = 255 * rVal;

から (ランダムに) 100 個の要素にインデックスを付け、 から255 を掛けmyimageた値を割り当てます。これは、Matlab の非常に強力な部分であるベクトル化です。Matlab は、1 回の操作で多数の数値を操作できます (速度を上げるために、常にそうする必要があります)。上記は次と同等ですrVal

for ii = 1:100
  myimage(rPix(ii)) = 255 * rVal(ii);
end

はるかに高速です...

于 2013-06-18T19:29:49.133 に答える
1

ランダム ピクセルを取得するには、xyの 2 つの変数を取り、制限内でそれぞれのランダムな値を生成します。ランダムなピクセル値を生成し、(x,y) の値を取得したランダム値に置き換えます。次のようになります。

for i=1:100
  x = randi([1 512]);
  y = randi([1 683]);
  myimage(x,y) = rand(1)*255;
end;
于 2013-06-18T19:35:40.907 に答える