如何在暗室中做出高 ISO 效果?

How to make a high ISO effect in a dark room?

当我们在光线不好的房间使用移动或半专业相机时,他们通常会增加 ISO,结果如下所示:

这是视频中的一帧,您可以看到有很多噪点。也许这有点奇怪,但我需要在高质量视频上产生类似的噪音。然而,一个简单的噪声发生器会产生类似这样的东西:

有没有人知道如何获得像第一帧那样的结果?或者可能有一些现有的噪音 generator/algorithm 来制作它?如果有任何帮助,我将不胜感激。

您基本上需要增加“颗粒”尺寸,并且可能会拉平您的噪声点。

很难获得看起来自然的结果,因为那些颗粒点在视频是通过对从相机传感器获得的值进行各种类型的插值获得的(具有传感器产生的特定噪声)。
以“模拟”胶卷相机为例(用胶卷拍摄的照片具有胶卷本身使用的有效矿物 sizes/shapes 的颗粒状自然外观)。如果通过数字图像滤镜制作出看起来很自然的类似电影的电影如此容易,那么电影业就不会看到现在发生的卷土重来。

话虽如此,我想到了三件可行的事情:

中值模糊(图像 + 一些噪声):
https://docs.opencv.org/master/d4/d13/tutorial_py_filtering.html

具有 Perlin 噪声生成的图像,根据您的特定帧大小相应缩放 + 添加图像的颜色 * 一些因素:
https://github.com/ruslangrimov/perlin-noise-python-numpy
* 因素 + 你的形象 = 结果


使用设置为产生相同帧分辨率和高 iso 的相机拍摄一个非常暗的房间,在您的视频上添加获得的视频帧(要应用一些图像处理)。
希望这对您的项目有所帮助并祝您好运。

我假设您只是在图像中添加了小的随机 RGB...

我会保留原样的颜色并尝试通过少量随机降低颜色强度以使图像变暗并产生类似形式的噪点。只需将您的 RGB 颜色乘以小于一的随机数 ...

为了提高结果视觉效果,随机值应符合高斯分布或类似分布。这里是 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,0,bmp1);
//  bmp1->SaveToFile("out.bmp");
    }
//---------------------------------------------------------------------------

输入图像:

输出图像:

您可以使用 PRNG 属性来调整光线和噪音。

您在该帧中看到的不是原始传感器噪声,也不是公认答案似乎暗示的胶片颗粒模拟。相反,它是应用于高 ISO 图像的降噪滤波器的结果。如果没有滤波器,您会看到很多噪声,主要是泊松噪声。

我不知道相机内置了什么降噪滤镜,但它可能在转换为 RGB 之前应用于原始图像。 Here are many papers describing such filters.