问题描述
当我们在光线不好的房间里使用移动或半专业相机时,它们通常会增加 ISO,结果如下所示:
这是视频中的一帧,你可以看到有很多噪音。也许这有点奇怪,但我需要在高质量视频上产生类似的噪音。然而,一个简单的噪声发生器会产生这样的结果:
有没有人有一些想法如何获得像第一帧那样的结果?或者也许有一些现有的噪声发生器/算法来制作它?如有任何帮助,我将不胜感激。
解决方法
您在该帧中看到的不是原始传感器噪声,也不是像公认的答案所暗示的那样模拟胶片颗粒。相反,它是应用于高 ISO 图像的降噪过滤器的结果。如果没有过滤器,您会看到很多噪声,主要是泊松噪声。
我不知道相机内置了什么降噪滤镜,但它很可能在转换为 RGB 之前应用于原始图像。 Here are many papers describing such filters。
,你基本上需要增加“颗粒”的大小,并且可能会消除你的噪点。
很难获得看起来自然的结果,因为这些颗粒是在视频中获得的来自对从相机传感器获得的值的各种类型的插值(具有传感器产生的特定噪声)。
以“模拟”胶片相机为例(从胶片本身使用的有效颗粒大小/形状来看,用胶片拍摄的照片具有颗粒状的自然外观)。如果在数字图像上制作出看起来很自然的电影滤镜那么容易,那么电影业就不会看到现在发生的卷土重来。
话虽如此,我想到了三件事可以起作用:
中值模糊(图像 + 一些噪点):
https://docs.opencv.org/master/d4/d13/tutorial_py_filtering.html
使用 Perlin 噪声生成的图像,根据您的特定帧大小进行缩放 + 添加图像的颜色 * 某些因素:
https://github.com/ruslangrimov/perlin-noise-python-numpy
* 因素 + 你的形象 = 结果
拍摄一个非常暗的房间,相机设置为产生相同的帧分辨率和高iso,在您的视频上添加获得的视频帧(要应用一些图像处理)。
希望这些对您的项目有所帮助并祝您好运。 ,
我假设您只是在图像中添加了小的随机 RGB...
我会保持颜色不变,并尝试通过少量随机量降低颜色强度以使图像变暗并产生类似形式的噪声。只需将您的 RGB 颜色与小于 1 的随机数相乘...
为了改善结果视觉效果,随机值应具有高斯分布或类似分布。这里的小 C++/VCL 示例:
//$$---- Form CPP ----
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "win_main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMain *Main;
Graphics::TBitmap *bmp0,*bmp1;
//---------------------------------------------------------------------------
__fastcall TMain::TMain(TComponent* Owner) : TForm(Owner)
{
// init bmps and load from file
bmp0=new Graphics::TBitmap;
bmp1=new Graphics::TBitmap;
bmp0->LoadFromFile("in.bmp");
bmp0->HandleType=bmDIB;
bmp0->PixelFormat=pf32bit;
bmp1->Assign(bmp0);
ClientWidth=bmp0->Width;
ClientHeight=bmp0->Height;
Randomize();
}
//---------------------------------------------------------------------------
void __fastcall TMain::FormDestroy(TObject *Sender)
{
// free bmps before exit
delete bmp0;
delete bmp1;
}
//---------------------------------------------------------------------------
void __fastcall TMain::tim_updateTimer(TObject *Sender)
{
// skip if App not yet initialized
if (bmp0==NULL) return;
if (bmp1==NULL) return;
int x,y,i,a;
union _color
{
BYTE db[4];
DWORD dd;
};
// copy bmp0 into bmp1 with light reduction and noise
for (y=0;y<bmp0->Height;y++)
{
_color *p0=(_color*)bmp0->ScanLine[y];
_color *p1=(_color*)bmp1->ScanLine[y];
for (x=0;x<bmp0->Width;x++)
{
p1[x]=p0[x];
for (a=40,i=0;i<10;i++) a+=Random(10); // "gauss" PRNG in range 40 .. 140
for (i=0;i<3;i++) p1[x].db[i]=(DWORD(p1[x].db[i])*a)>>8; // multiply RGB by a/256
}
}
// render frame on App canvas
Canvas->Draw(0,bmp1);
// bmp1->SaveToFile("out.bmp");
}
//---------------------------------------------------------------------------
输入图像:
输出图像:
您可以使用 PRNG 属性来调整亮度和噪音。