2

对于下面的字母,我希望通过将 5% 的 1 变为 0 来增加噪音。到目前为止,我有以下代码将它们全部变为 0。有人可以指出我正确的方向吗?谢谢!

letterA = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ...
           0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ...
           0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ...
           0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ...
           0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ...
           0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; 

for i=1:numel(letterA)
    if letterA(i)==1
        letterA(i)=0;
    end
end

disp(letterA)
4

3 回答 3

3

尝试这个:

letterA( letterA == 1 & rand(size(letterA)) <= 0.05 ) = 0;

事实上你也可以这样做

letterA( rand(size(letterA)) <= 0.05 ) = 0;

它将每个元素以 5% 的概率设置为零。已经为零的元素不受影响。我认为这里引起混淆的原因是您必须认识到每个元素都是相互独立处理的。如果您执行第一个或第二个版本,则没有区别。

你可以检查它:

 letterA = (rand(1e5,1) < 0.2); N1 = nnz(letterA);
 letterA( rand(size(letterA)) <= 0.05 ) = 0;
 (N1 - nnz(letterA))/N1

它给出了大约 0.05 的值,即 5%。EitanT 所说的,它最多会翻转 5% 是不正确的。它可以超过 5% 或更少,但平均为 5%。

EitanTs 版本恰好翻转 5%,因此选择哪个版本取决于应用程序。对于 EitanT 版本,噪声与信号相关(因为它是精确的),这可能是也可能不是您想要的。

于 2013-07-15T17:20:33.327 回答
2

基本方法是找到 1 的索引并计算它们,从中随机选择所需数量的索引,然后对它们进行操作:

one_flip_ratio = 0.05;
idx_ones = find(letterA == 1);                          %// Indices of 1's
flips = round(one_flip_ratio * numel(idx_ones));        %// Number of flips
idx_flips = idx_ones(randperm(numel(idx_ones), flips)); %// Indices of elements
letterA(idx_flips) = 0;                                 %// Flip elements

这会将 5% 的 1 翻转为 0。

于 2013-07-15T17:20:53.783 回答
0

感谢您提出所有这些想法,但最终我想出了这个。它可以让我轻松控制字母和背景噪音,这是我打算做的。我只是一个新手,所以这可能不是最有效的代码,但它可以完成工作!(我不是在寻找确切的 5%,肉眼显示值是我更担心的。)请告诉我如何改进!谢谢你。

background_noise_intensity=0.05;
letter_noise_intensity=0.05;

for i=1:numel(letterA)
    if letterA(i)==0
        if rand < background_noise_intensity
            letterA(i)=1;
        end
    elseif letterA(i)==1
        if rand < letter_noise_intensity
            letterA(i)=0;
        end
    end
end

noisy_letters=letterA;

reshaped_noisy_letters=reshape(noisy_letters,37,19)';
imshow(reshaped_noisy_letters);
于 2013-07-15T18:42:11.140 回答