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