随机选择图片Matlab中的像素

时间:2013-06-18 19:26:27

标签: matlab

我有一张灰度图片,我想手动添加噪音。首先,我想随机选择一个像素,生成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个像素,以及如何用我创建的值替换它们。非常感谢,谢谢。

3 个答案:

答案 0 :(得分: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中,只要不使用大于数组中元素数的数字,就可以将1D索引用于2D数组。因此,如果

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;

索引(随机)来自myimage的100个元素,并将rVal中的值乘以255.这是Matlab中非常强大的部分:矢量化。你可以拥有(并且,为了速度,应该总是尝试)Matlab可以在一次操作中对许多数字进行操作。以上相当于

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

只是快得多......

答案 1 :(得分:1)

要获得随机像素,您可以使用两个变量 x y ,并为限制内的每个变量生成随机值。生成随机像素值,并将(x,y)处的值替换为您获得的随机值。它看起来像是:

for i=1:100
  x = randi([1 512]);
  y = randi([1 683]);
  myimage(x,y) = rand(1)*255;
end;

答案 2 :(得分:0)

使用函数randperm

image = imread('image_name.extension');
[row col] = size(image);
indices = randperm(row*col);
loc = randperm(100);

randomly_selected_pixels = image(indices(loc));

% Assign the values that you have to these "randomly_selected_pixels"